0

应该在UIManagedDocument我的两个设备上打开相同的内容,然后保存(使用以下代码):

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

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

我被告知UIManagedDocuments 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)

有谁知道为什么会发生这个错误?

4

1 回答 1

0

有几件事...

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

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

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

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

唯一的另一件事......如果上面的代码确实触发了保存 - 您可能会遇到将其作为 performBlockAndWait 执行的问题。UIManagedDocument 保存例程异步执行操作 - 但它们需要运行循环才能执行,然后才能真正有机会运行异步部分......因此,在继续之前阻塞,您实际上可能会阻止执行实际保存或其他事情。

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

于 2013-05-18T09:15:30.377 回答