1

我完成了我的应用程序进行距离计算。我会在复制之前更新我的数据库。我做了一些测试,当我将我的数据库(DataBase.sqlite)移动到“复制捆绑资源”并在我的设备上运行应用程序时,我看不到我的数据。

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

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

你有什么想法吗?

4

1 回答 1

0

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

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

如果您想将其复制到您的 Documents 文件夹以便使用它,您可以通过以下方式获取 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 中测试数据库是否存在,将导致误报)。

于 2013-08-13T15:15:33.703 回答