2011-02-17 141 views
5

我想将一个sqlite数据库添加到XCode 4(也适用于XCode 3)。教程状态添加.db文件到资源文件夹,我想这会被复制到〜/库/应用程序支持/ iPhone模拟器/ 4.2 /应用程序/ {some-id} /文件/生成期间,你可以找到NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)如何将文件添加到XCode中的资源文件夹?

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

我已经尝试添加文件与添加文件...命令,然后它出现在目标> AppName>复制束资源,但始终是一个空的.db文件出现在上述文档文件夹(然后我手动替换 - 显然不是正确的做法)

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

回答

11

你要开始在你的项目的xcode加入你的数据库,所以它将被添加到您的捆绑文件夹中,您可以在其中通过代码找到它:

[NSBundle mainBundle] 

这是唯一的文件夹,你可以通过xcode添加文件,当你“建立”你的应用程序时(最终使用子文件夹,而不是“系统”文件夹作为“文档”),现在你只需要记住主包文件夹只是“只读”,所以你不能使用你的数据库写权限。 所以正常的方法是:

1)当你想使用你的数据库,检查通过代码,如果它存在于应用程序:文件夹。 当然第一次它不是,所以

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/project中的记录,没有记录将被添加到它,所以如果由于任何原因你删除你的应用程序在iPhone /模拟器(或“清除所有目标”的xCode“生成”菜单)检查/复制方法将再次将“virgin”db复制到文档文件夹中,因此您将丢失所有更改...

+1

我只是想询问该代码是否仍然有效的IOS 8和优山美地作为SQLite的文件的位置已经改变 – 2014-12-01 14:51:39

2

请注意您放入Documents文件夹的数据量,这是针对用户数据的,因为这数据将使用iCloud进行备份Apple已经限制了应用程序可以在“文档”文件夹中存储和使用的数据量。

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

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