【问题标题】:Coredata Error "data: <fault>"Coredata 错误“数据:<故障>”
【发布时间】:2011-11-10 09:08:39
【问题描述】:

我尝试使用以下代码从 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;
}

有没有办法调试这个?

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    我在从 CoreData 提取数据时遇到了同样的问题!所以,我按照@jrturton 指示的方式在 Swift 3 中实现了它:

    第一步:添加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! 
    }
    

    希望,它会帮助你。 :)

    【讨论】:

      【解决方案2】:

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

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

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

      这似乎是一个常见的误解,我决定写下它,here

      【讨论】:

      • 您可以通过调用[request setReturnsObjectsAsFaults:NO]; 来关闭该属性;
      • 故障令人困惑,他们可能会说“未获取数据”之类的
      • Fault 是计算机科学架构中使用的通用关键字
      • @AbhishekBedi 不,不是。这是 Core Data 专门使用的“特殊”词,表示与普通字典定义不同的东西。肯定是错误的命名。
      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2016-10-22
      • 2012-02-11
      • 2013-01-16
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多