在bundle中复制后无法在设备中看到DataBase

时间:2013-08-13 14:13:01

标签: xcode core-data

我完成了我的App以进行距离计算。我会在复制之前更新我的数据库。 我做了一些测试,当我将我的数据库(DataBase.sqlite)移动到“Copy Bundle Ressources”并在我的设备上运行App时,我看不到我的数据。

看起来设备正在使用自己的同名数据库(DataBase.sqlite)。 (DataBase将在启动期间更新TableView)

我创建了一个AddButton来查看我是否可以从iPhone更新我的DataBase并且它可以工作。 我的意思是我关闭App并重新启动它,我可以看到AddButton创建的数据。

你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当您通过Xcode的“复制捆绑资源”将数据库包含到您的捆绑包中时,它是捆绑包的一部分,即您通过以下途径获取路径:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"sqlite"];

如果要将其复制到Documents文件夹以便可以使用它,可以通过以下方式获取文档路径:

NSString *documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *documentsPath   = [documentsFolder stringByAppendingPathComponent:@"DataBase.sqlite"];

因此,您可以检查Documents中是否存在,如果没有,则从bundle复制到Documents:

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:documentsPath]) {
    NSError *error = nil;
    BOOL success = [fileManager copyItemAtPath:bundlePath toPath:documentsPath error:&error];
    NSAssert(success, @"%s: copyItemAtPath failed: %@", __FUNCTION__, error);
}

您现在可以在Documents文件夹中打开数据库(例如,使用documentsPath)。

现在,如果您曾试图在没有先从捆绑中复制的情况下在Documents中打开数据库,则标准sqlite3_open将创建一个空白数据库。因此,您可能希望从设备/模拟器中删除应用程序然后重新安装,以摆脱Documents中的空白数据库(否​​则上述逻辑,测试Documents中数据库的存在,将导致误报)。