5

我想向 XCode 4 添加一个 sqlite 数据库(也适用于 XCode 3)。教程状态将 .db 文件添加到资源文件夹,我想这将被复制到~/Library/Application Support/iPhone Simulator/4.2/Applications/{some-id}/Documents/在构建期间您可以找到文件NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 等等

但是,XCode 4 没有可见的资源文件夹。

我尝试使用 Add File... 命令添加文件,然后它出现在 Targets > AppName > Copy Bundle Resources 中,但上面的文档文件夹中总是出现一个空的 .db 文件(然后我手动替换 - 显然不是正确的方法!)

(由于数据的性质,我在 CoreData 上坚持使用 sqlite)

4

2 回答 2

11

你必须开始在你的 project-xcode 中添加你的数据库,所以它将被添加到你的 bundle 文件夹中,你可以通过代码找到它:

[NSBundle mainBundle]

它是您在“构建”应用程序时可以通过 xcode 添加文件的唯一文件夹(最终使用子文件夹,但不是“系统”文件夹作为“文档”)现在您只需要记住主捆绑文件夹只是“只读”,因此您不能在那里使用具有写权限的数据库。所以正常的方法是:

1)当你想使用你的数据库时,通过代码检查它是否存在于 app:documents 文件夹中。当然第一次没有,所以

2)从主包中复制它

- (BOOL)transferDb {
    NSError **error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourData.db"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath: path])
    {
        NSString *bundle =  [[ NSBundle mainBundle] pathForResource:@"preferenze" ofType:@"plist"];
        [fileManager copyItemAtPath:bundle toPath:path error:error];
        return YES;
    }
    return NO;
}

3)在文档文件夹中使用它(r/w)

ps:并且(当然)请记住,当您在 iPhone/模拟器中使用/编辑/编写数据库时,可能会添加记录,主包中的一个,当然您的 mac/项目中的那个不会被更新,不会向其中添加任何记录,因此如果出于任何原因您在 iPhone/模拟器上删除了您的应用程序(或通过 xCode“构建”菜单“清除所有目标”),检查/复制方法将复制“处女”数据库再次打开文档文件夹,因此您将丢失所有更改...

于 2011-02-17T07:19:44.723 回答
2

请注意您放入 Documents 文件夹的数据量,这是用于用户数据的,因为这些数据将使用 iCloud 备份,Apple 限制了应用程序可以在 Documents 文件夹中存储和使用的数据量。

我的应用程序因以这种方式使用 6MB SQLite 数据库而被拒绝。而是将其复制到缓存目录:NSCachesDirectory。

或者防止文件被备份:https ://developer.apple.com/library/ios/#qa/qa1719/_index.html

于 2012-04-23T14:17:15.160 回答