核心数据错误

7

我正在使用RestKit从服务器映射Json数据,并通过从数据库获取这些数据来显示它们。

我的视图中有一个刷新按钮,可以再次执行上述操作。

场景: 我有两个表Key和Profile,它们之间具有一对一的关系。我正在使用以下代码从数据库中获取数据:

NSFetchRequest *fetchRequest = [Key fetchRequest];
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Profile"]];
[fetchRequest setIncludesSubentities:YES];
NSArray *sortedObjects = [Key executeFetchRequest:fetchRequest]; 

上述数组返回了数据库中的所有对象。但是当我使用断点检查时,发现出现了一些核心数据错误,这就是未显示所有数据的原因。
// sortedObjects中的所有数据都是这样的。
<Key: 0x889f2f0> (entity: Key; id: 0x889e400 <x-coredata://981A476D-55AC-4CB4-BBD8-E0285E522412/Key/p1489> ; data: <fault>)

有什么想法

2个回答

22

可能是对“fault”概念的误解。

苹果文档所述:

“错误对象(Fault)”是Core Data使用的一种机制,用于减少应用程序的内存使用。

以及

一个“错误对象(Fault)”是一个占位符对象,表示尚未完全实现的托管对象或表示关系的集合对象:

因此,如果在使用Core Data时在日志中看到“错误对象(fault)”这个词,它并不意味着发生了错误。你的应用程序出现了什么意外的行为?


Restkit 中存在一些缓存问题,它没有将所有对象缓存到数据库中。但是当我升级了 Restkit 后,缓存问题得到了解决。不知道确切的原因。谢谢你的回答。 - iPhone Guy

19

您实际上没有描述出一个问题。Core Data 错误不是错误——它更像是文件系统中的页面错误。这只是意味着数据还没有被读取。您所描述的完全是正常和预期的行为。如果您访问返回对象的任何属性,故障将自动填充,然后您将看到结果。因此,如果您的 Key 实体有一个名为 name 的属性,您仍然可以查找 name 的值并甚至记录它们(如果您想要的话)。

如果您想要强制填充故障,请在执行获取请求之前添加以下内容:

[fetchRequest setReturnsObjectsAsFaults:NO];

虽然这并不是必需的,取决于您拥有的属性和获取的对象数量,可能会使用比实际需要更多的内存。


找不到我的问题,但从您的答案中得到了一个想法。 - iPhone Guy
你还没有描述任何问题。Core Data 中的故障并不是一个问题。你有没有没有解释清楚的更多内容? - Tom Harrington
其实我的问题是我正在使用restkit框架来映射从服务器获取的JSON数据并从数据库中提取等操作。但是restkit存在一些缓存问题,无法从数据库中获取所有数据。如果我有50条记录,有时它只会获取20条记录,有时它会获取全部50条记录。我认为这是缓存问题。我刚刚升级了我的restkit,现在它运行良好。您能否向我推荐一些关于core data的好教程以便更深入地了解?谢谢。 - iPhone Guy
我的首选是“iOS核心数据”,你可以在http://amzn.com/0321670426找到它(全称:我是合著者之一)。Marcus Zarra的书也很不错。 - Tom Harrington
我也推荐Marcus Zarra的书。 - Adam Waite
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接