我在10.6中编写了一个简单的Cocoa应用程序。在程序运行时(程序定期保存到数据存储区),我停电,并且我的程序使用的sqlite文件已经以某种方式损坏。停电后的sqlite存储中的核心数据损坏
我创建一个标准的方式被管理对象上下文:
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
,通常一切都很好,但是这一次,读取对象时:
NSLog(@"%@",dir.files);
我得到:
2011-06-03 11:33:38.079 Backup Check[1927:3c03] Relationship fault for
(<NSRelationshipDescription: 0x100562230>), name files, isOptional 1,
isTransient 0, entity Directory, renamingIdentifier files, validation
predicates (
), warnings (
), versionHashModifier (null), destination entity File, inverseRelationship
directory, minCount 0, maxCount 0 on 0x10058bbc0
我在命令行尝试了sqlite3工具,很多东西都可以正确读取,但是对于som Ë表读我得到了一堆表项,然后:
SQL error: database disk image is malformed
我猜测,在保存时正好发生了停电。我有几个问题: 1)我该如何检测/恢复?现在我没有收到任何我创建对象上下文时可以看到的错误。此外,许多表格都没有错误,只有在深入研究子表格时,我才会发现这种关系错误。我无法检查null,因为一个对象正在被返回 - 它只是不是NSSet。这是某种关系故障对象。 2)我如何采取措施预防未来的腐败?在创建托管对象上下文时是否有一种简单的方法来检查一致性,如果检测到损坏,我可以回滚到旧版本?在应用程序支持目录中,我只看到一个文件,这是损坏的数据库。
感谢您的信息。我不在乎修理这个特别的商店,而是防止未来发生。有一件事我仍然想知道 - 我有一个名为Directory的管理对象,带有一个类成员“files”。我的理解是,当我到NSLog的类成员,它会被提取。但在这里,当我真正尝试将消息传递给NSSet“.files”时,它会使程序崩溃。我怎么可以在这里放一些代码来检查并看看ghost对象是否实际上不指向任何东西,因此我可以重建coredata存储? – Ryan 2011-06-03 19:55:07
不,一个关系中的对象将被默认取为故障。这是为了防止级联加载大量的对象。当您访问故障表示的对象的属性时,故障只会转换为管理对象(行话中的“故障”)。看到“关系错误”简单并不是错误。将故障看作“占位符对象”。 – TechZen 2011-06-03 20:17:21