我想将一个sqlite数据库添加到XCode 4(也适用于XCode 3)。教程说明将.db文件添加到资源文件夹,我想这会在构建期间复制到〜/ Library / Application Support / iPhone Simulator / 4.2 / Applications / {some-id} / Documents / 在哪里可以找到NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
的文件
等
但是,XCode 4没有可见的资源文件夹。
我尝试使用“添加文件...”命令添加文件,然后它出现在“目标”> AppName>复制捆绑资源,但总是一个空的.db文件出现在上面的文档文件夹中(然后我手动替换 - 显然不是正确的方法!)
(由于数据的性质,我坚持使用sqlite而不是CoreData)
答案 0 :(得分:11)
你必须开始在你的project-xcode中添加你的数据库,所以它将被添加到你的bundle文件夹中,你可以通过代码找到它:
[NSBundle mainBundle]
这是唯一可以在“构建”应用程序时通过xcode添加文件的文件夹(最终使用子文件夹,但不是“系统”文件夹作为“文档”),现在您只需要记住主要的bundle文件夹只是“只读”,所以你不能使用你的数据库写权限。 所以通常的方法是:
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“构建”菜单“清除所有目标”),检查/复制方法将复制文档中的“处女”数据库文件夹,所以你将失去所有的变化......
答案 1 :(得分:2)
请注意您放入Documents文件夹的数据量,这是针对用户数据的,因为这些数据将使用iCloud进行备份Apple限制了应用程序可以在文档中存储和使用的数据量文件夹中。
我的应用程序以这种方式使用6MB SQLite数据库被拒绝。而是将其复制到缓存目录:NSCachesDirectory。
或阻止备份文件:https://developer.apple.com/library/ios/#qa/qa1719/_index.html