使用UIManagedDocument在iOS 5中预加载核心数据数据库

How*_*l21 13 iphone core-data objective-c ios5

我正试图想出一种方法,我可以在使用时将数据预加载到核心数据中UIManagedDocument.到目前为止,我的尝试是使用此代码在"Loader"应用程序中创建文档.

NSURL *url  = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                                      inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Default Database"];
if(![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]){
    [self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
        if(success)[self loadDataIntoDocument];
    }];
}
Run Code Online (Sandbox Code Playgroud)

然后将persistentStore文件从在模拟器目录中创建的'documents'目录复制到Xcode中的资源部分,用于将使用加载的数据库的主应用程序.

我的问题是我无法弄清楚如何从应用程序包中复制该文档并将其成功用作文档.

我已经尝试从应用程序包中按原样复制文档目录,并尝试将其作为文档访问,该文档给出了UIManagedDocument只能访问文件包的错误.我尝试在主应用程序中创建另一个新文档,并将bundle中的persistentStore复制到文档中创建的具有相同错误的文件中.而且我尝试过使用UIManagedDocument-(BOOL)loadFromContents:ofType:error: 方法..我甚至不确定这是我应该使用的方法.

有没有人知道这通常是怎么做的?谢谢!

she*_*ezi 9

我不认为你应该在iOS中自己处理文件和目录.

但是,您可以直接从捆绑包中打开文档.为此,您只需将在Loader应用程序中创建的整个文档目录复制到最终的包中.结构应该相当简单,只有两个目录,其中包含persistentStore文件.

之后,当您想要打开文档时,需要注意两件事:您需要使用bundle目录作为基本目录,并且需要/在"文件"名称的末尾添加一个,因此UIManagedDocument知道目录是文件.代码如下所示:

NSURL* url = [[NSBundle mainBundle] bundleURL];
url = [url URLByAppendingPathComponent:@"filename/"];
UIManagedDocument* doc = [[UIManagedDocument alloc] initWithFileURL:url];
Run Code Online (Sandbox Code Playgroud)

请注意,您无法写入该文件,因为您不允许在应用程序包中写入.因此,如果您想要一个可写文档,则需要将该文档复制到文档文件夹中.只需保存doc到其他位置即可轻松完成此操作:

[doc saveToURL:newURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){}]
Run Code Online (Sandbox Code Playgroud)

还有一件事:您必须确保在应用包中创建了文件夹结构.实现这一目标的最简单方法是将整个文件夹拖到项目中,然后选择"为任何添加的文件夹创建文件夹引用".对于"文件" symbollist_en(实际上是一个包/文件夹本身),它应该如下所示:
XCode中的文件夹引用
如果您不这样做,文档的"内容"将直接驻留在您的应用程序包中,不能UIManagedDocument像您发现的那样打开.