在两个不同的设备上保存相同的UIManagedDocument会产生错误

时间:2013-05-14 15:37:13

标签: icloud uimanageddocument

如果我的两台设备都打开了相同的UIManagedDocument,我保存(使用以下代码):

[self.documentDatabase.managedObjectContext performBlockAndWait:^{
    STNoteLabelCell *cell = (STNoteLabelCell *)[self.noteTableView cellForRowAtIndexPath:indexPath];

    [cell setNote:newNote animated:YES];
}];

我被告知UIManagedDocument的documentState更改为UIDocumentStateSavingError然后我收到此错误:

CoreData: error: (1) I/O error for database at /var/mobile/Applications/some-long-id/Documents/Read.dox/StoreContent.nosync/persistentStore.  SQLite error code:1, 'cannot rollback - no transaction is active'
2013-05-14 16:30:09.062 myApp[11711:4d23] -[_PFUbiquityRecordImportOperation main](312): CoreData: Ubiquity:  Threw trying to get the knowledge vector from the store: <NSSQLCore: 0x1e9e2680> (URL: file://localhost/var/mobile/Applications/some-long-id/Documents/Read.dox/StoreContent.nosync/persistentStore)

有人知道这个错误发生的原因吗?

1 个答案:

答案 0 :(得分:0)

有几件事......

我认为在两个不同的设备上保存相同的文档是一个红色的鲱鱼,因为它实际上将在每个设备上的数据库的本地副本上工作 - 只有事务日志上传到iCloud。

其次,我可能会感到困惑,但我在上面的代码片段中没有看到任何表明您正在执行保存的内容(除非它是由其中一个调用触发,或者是自动保存发生)。

该代码片段似乎正在做的是:

  • 在数据库文档的子MOC线程上,运行以下块 代码
  • 那段代码正在做纯粹的UI相关的东西, 没有什么可以与数据库实际做?唯一可能的事情 要出去的数据库是cellForRowAtIndexPath - 这通常是 预计只会做读操作,而不是东西 需要保存。

唯一的另一件事......如果上面的代码确实触发了保存 - 你可能会遇到执行它作为performBlockAndWait的问题。 UIManagedDocument保存例程异步执行 - 但是他们需要运行循环才能在实际有机会运行异步部分之前执行...所以在继续之前阻塞可能实际上阻止了实际的保存被执行或者其他东西。

我在这里疯狂地猜测,但是已经看到了足够的保存托管文档,知道要真正小心实际调用哪些线程,并且在发出保存请求之后,允许运行循环到有机会实际做到这一点。公平地说,这只是一个问题,在一个方法或循环中重复调用saveToURL:在这种情况下,保存的所有异步部分都排队并在最后执行,通常是非常滑稽的效果。