如何在XCode中添加文件到资源文件夹?

5
我想要将sqlite数据库添加到XCode 4中(适用于XCode 3)。教程说明需要将.db文件添加到资源文件夹中,我想这在构建过程中会被复制到〜/ Library / Application Support / iPhone模拟器 / 4.2 / Applications / {some-id} / Documents /中,您可以使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)等命令找到该文件。
然而,XCode 4没有可见的资源文件夹。
我尝试使用“添加文件…”命令添加文件,然后它出现在目标应用程序名称>复制包资源中,但总是会出现上面文档文件夹中的空.db文件(然后我手动替换-显然不是正确的方法!)
(由于数据的性质,我坚持使用sqlite而不是CoreData)
2个回答

11

你需要在你的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)在文档文件夹中使用它(读/写)

备注: 当您在iPhone /模拟器中使用/编辑/编写数据库时,可能会添加记录。但是主捆绑包中的数据库以及Mac /项目中的数据库不会被更新,也不会添加任何记录。因此,如果出于任何原因删除iPhone /模拟器上的应用程序(或通过xCode“构建”菜单中的“清理所有目标”),则检查/复制方法将再次在文档文件夹中复制“初始”数据库,因此您将失去所有更改...


1
我想询问一下,这段代码在IOS 8和Yosemite上是否仍然有效,因为SQLite文件的位置已经改变了。 - clive dancey

2
请注意您将放入“文档”文件夹中的数据量,这仅适用于用户数据,由于此数据将使用iCloud进行备份,因此苹果公司限制了应用程序可以在“文档”文件夹中存储和使用的数据量。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接