2013-05-14 62 views
0

应在同一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) 

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

回答

0

几件事情......

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

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

什么是代码片段似乎是这样做的:

  • 在您的数据库文件的孩子MOC线程运行的代码
  • 和代码块以下块 是做纯粹的UI相关的东西, 没有实际的数据库?可能 走出去到DB的唯一的事情是的cellForRowAtIndexPath - 而这通常 预计将只在做读操作,并不需要保存的东西 。

唯一的其他东西....如果上面的代码确实会触发保存 - 您可能会遇到执行该问题时执行performBlockAndWait的问题。 UIManagedDocument保存例程异步执行 - 但它们需要运行循环在他们真正有机会运行异步部分之前执行......因此,在继续之前通过阻塞可能实际上阻止了正在执行的实际保存或其他内容。

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

相关问题