Coredata错误“数据:<故障>”


107

我尝试使用以下代码从CoreData中提取数据

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Cave" inManagedObjectContext:self.context];
request.predicate = [NSPredicate predicateWithFormat:@"(latitude > 0) AND (longitude > 0)"];

NSError *error;
NSLog(@"%@",[self.context executeFetchRequest:request error:&error]);
NSLog(@"%@",[error localizedDescription]);

CoreData应该具有9个匹配的对象,并找到9个对象。所以谓词应该起作用,但是我在控制台中得到了

2011-09-05 07:41:42.267 CaveConditions[6930:11903] (
    "<NSManagedObject: 0x7368060> (entity: Cave; id: 0x7367880 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p31> ; data: <fault>)",
    "<NSManagedObject: 0x73547e0> (entity: Cave; id: 0x7356e20 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p40> ; data: <fault>)",
    "<NSManagedObject: 0x73681e0> (entity: Cave; id: 0x7363e60 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p42> ; data: <fault>)",
    "<NSManagedObject: 0x7368280> (entity: Cave; id: 0x7356be0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p72> ; data: <fault>)",
    "<NSManagedObject: 0x7368320> (entity: Cave; id: 0x733ad80 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p73> ; data: <fault>)",
    "<NSManagedObject: 0x73683c0> (entity: Cave; id: 0x7333e70 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p91> ; data: <fault>)",
    "<NSManagedObject: 0x7368480> (entity: Cave; id: 0x7361810 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p101> ; data: <fault>)",
    "<NSManagedObject: 0x7368570> (entity: Cave; id: 0x7360110 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p105> ; data: <fault>)",
    "<NSManagedObject: 0x7368610> (entity: Cave; id: 0x73303c0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p112> ; data: <fault>)"
)

在我对Cave.m(即实体)进行以下更改之前,它一直运行良好

我在Cave.h中将MKAnnotation添加为委托,并在Cave.m中添加了此代码。

- (CLLocationCoordinate2D)coordinate
{
    CLLocationCoordinate2D location;
    location.latitude = [self.latitude doubleValue];
    location.longitude = [self.longitude doubleValue];
    return location;
}

有办法调试吗?

Answers:


273

这是预期的行为,在您需要访问对象的持久值之前,核心数据不会返回完整的对象。到此为止,您返回的每个对象都将是一个“故障”。

您可以使用强制获取请求返回完整的对象[request setReturnsObjectsAsFaults:NO],但是在大多数情况下,您可以拥有所有资源。有关更多信息,请参阅NSFetchRequest的文档。

如果访问其中一个属性,则核心数据将进入持久性存储并获取其余值,然后您将在日志中获得完整的描述。

这似乎是一种普遍的误解,我决定在这里写下。


57
您可以通过调用[request setReturnsObjectsAsFaults:NO]关闭该属性;
Qamar Suleiman '02

21
故障令人困惑,他们可能会说“未提取数据”之类的东西
Cristi Băluță 2015年

1
故障是计算机科学体系结构中使用的通用关键字
Abhishek Bedi

@AbhishekBedi不,不是。这是Core Data专门使用的“特殊”词,表示与常规词典定义不同的内容。肯定是不好的命名。
卡森·霍兹海默

4

从CoreData提取数据时,我遇到了同样的问题!因此,我遵循@jrturton的指示并在Swift 3中实现了它:

步骤1:新增 import CoreData

步骤2:添加以下代码。。

let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
var request = NSFetchRequest<NSFetchRequestResult>()
request = Your_Entity_Name.fetchRequest()
request.returnsObjectsAsFaults = false
do {
    let arrayOfData = try context.fetch(request)
} catch {
    // Handle the error! 
}

希望对您有帮助。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.