2

这就是我需要的:让一个 sqlite 文件填充我在 iPhone 模拟器上创建的示例实体,然后在应用程序最初为我的所有用户运行时复制该文件。

我做了什么:

  1. 我在模拟器中创建了一堆条目。

  2. 我在 MAC 上的 iPhone Simulator iOS 文件夹中找到了附加到我的应用程序的 sqlite 文件。

  3. 从 .sqlite、.sqlite-shm、.sqlite-wal 这三个文件中,我只是将 .sqlite 文件复制到了我的 xCode 项目中。

  4. 当我运行应用程序时,.sqlite 文件显示为空!

我该如何解决?

谢谢!

编辑:

.sqlite-wal 和 .sqlite-shm 有什么意义?

为什么它们存在,为什么在 iOS7 之前不存在?

4

2 回答 2

1
  • 第一步 R OK 但随后你必须加载数据库

你需要这样的东西:

- (void)copyPreparedDatabase{
    __persistentStoreCoordinator = nil;

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DATABASE.sqlite"];
    NSString *storePath = [storeURL path];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DATABASE" ofType:@"sqlite"];
    if (defaultStorePath) {
        NSError *error = nil;

        if ([fileManager fileExistsAtPath:storePath]) {
            [fileManager removeItemAtPath:storePath error:&error];
        }
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:&error];

        NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
        if (![[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:storePath error:&error]) {

        }
    }
}

然后你从 AppDelelate.m 中的 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator 调用它

建议:做一些自定义开关,如#define IMPORT_PREPARED_DATABASE

这样做: if (![fileManager fileExistsAtPath:storePath] && !IMPORT_PREPARED_DATABASE) { //&& 1==2 [self copyPreparedDatabase];
}

所以你可以控制何时构建新的准备好的数据库或何时使用现有的....

注意:当你建立新的准备好的数据库sto模拟器时,复制数据库并将其粘贴到旧的...

于 2013-11-08T15:30:41.930 回答
0

本教程可以提供很大帮助。

你几乎做了所有事情,但你错过了重要的一步。您需要将 sqlite 复制到您的 xcode 项目,然后您需要检查persistentStoreCoordinator您的文档区域中是否存在 sqlite 文件。如果没有,您需要复制它。跳转到该教程中的“Doctor,Xcode 需要你”部分 :)。

于 2013-11-08T15:19:51.710 回答