iOS使用UIManagedDocument添加初始核心数据文件,而不是appdelegate

Posted

技术标签:

【中文标题】iOS使用UIManagedDocument添加初始核心数据文件,而不是appdelegate【英文标题】:iOS Adding Initial Core Data file using UIManagedDocument, NOT appdelegate 【发布时间】:2013-06-14 05:35:40 【问题描述】:

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

    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 并在我的顶视图控制器中执行此代码。因此,我遇到了一些问题。

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

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

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

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

因此,当我尝试在该 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 的“Store Content”文件夹中),但这也不起作用。 UIManagedDocument 无法打开文档。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于iOS使用UIManagedDocument添加初始核心数据文件,而不是appdelegate的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景

iOS 7:UIDocument / UIManagedDocument 和 iCloud 发生了啥?

UIManagedDocument 的迁移问题

UIManagedDocument vs NSManagedObject:性能

覆盖UIManagedDocument中的managedObjectModel

在核心数据中使用 UIManagedDocument 的标准(或正确)方法是啥