0

我正在尝试将初始数据库加载到我的应用程序中,以便我的核心数据数据库在安装时不为空。我现在正在使用这段代码:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) {
            NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@_InitialData", SQL_DATABASE_NAME] ofType:@"sqlite"];
            if (defaultStorePath) {
                    [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
            }
    }

(来自http://code.google.com/p/coredatalibrary/wiki/LoadingInitialData

尝试加载初始 sqlite 文件以供我的核心数据使用。它不起作用,我的程序与该链接中使用的类型在某些方面有所不同。

看来教程使用创建的文件来“使用核心数据”,我不是。我只是没有碰巧以这种方式学习它(观看了 stanford cs193p 视频),而是我使用 UIManagedDocument 并在我的顶视图控制器中执行此代码。因此,我遇到了一些问题。

  1. 我加载了我的应用程序以创建初始数据库,以便我可以保存文件以用于初始值。这样做后,我发现保存东西的方式与教程中的不同。例如,如果我的 UIManagedDocument 的 url 是 .../Documents/Test ,那么我的数据库文件是 .../Documents/Test/Store Content/persistentStore,其中“persistentStore”是数据库文件。一方面,添加了“存储内容”目录。另外,sqlite 文件名为persistentStore,没有文件扩展名。当我打开文件时,它说

SQLite 格式 3���@�������������������������������������������� ����������������������-,%

虽然在顶部(我不熟悉 SQLite 或任何 db 格式,但我认为这意味着它是一个 sqlite 文件)。

  1. 我保存这个“persistentStore”文件以使用上面的代码加载到我的应用程序中。这样做后,我发现 copyItemAtPath:toPath:error: 不会像我预期的那样复制。例如,如果 storePath 是 .../Documents/Test ,那么我正在复制的 sqlite 文件将重命名为 Test.sqlite 并位于 .../Documents/ 而不是将我的文件复制到.../文件/测试/。

因此,当我尝试在该 url (.../Documents/Test) 打开 UIManagedDocument 时,我收到此错误

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:
'UIManagedDocument can only read documents that are file packages'

在复制我的初始数据之前,我尝试创建一个目录来模仿由核心数据创建的目录(也就是说,我创建目录以具有 .../Documents/Test/Store Content/ 的路径,然后复制我的初始数据位于名称为 persistentStore 的“存储内容”文件夹中),但这也不起作用。UIManagedDocument 无法打开文档。

那么如何在没有设置为“使用核心数据”的项目的情况下将初始值加载到我的核心数据数据库中?我有(大概)带有初始数据的 sqlite 文件(当我打开它并浏览它时,它似乎有我的初始值),所以我只需要知道如何正确复制它,以便我仍然可以使用 UIManagedDocument 打开文档并通过 UIManagedObjectContext 保存。

4

1 回答 1

0

事实证明,我重新创建由核心数据创建的路径的方法奏效了。即,创建 .../Test/Store Content/ 的目录并将文件复制为“persistentStore”。我的错误很小。它应该是StoreContent而不是“Store Content”;我加了一个空格...

于 2013-06-14T05:54:30.870 回答