Ошибка общих данных «data: <fault>»

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, которое является Entity

Я добавил MKAnnotation в качестве делегата в Cave.h и добавил этот код в Cave.m

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

Есть ли способ отладить это?

Крис
источник

Ответы:

273

Это ожидаемое поведение, основные данные не будут возвращать полные объекты, пока вам не понадобится доступ к постоянным значениям объектов. До этого момента каждый из возвращенных вами объектов будет считаться «ошибкой».

Вы можете заставить запрос на выборку возвращать полные объекты, используя [request setReturnsObjectsAsFaults:NO], но в большинстве случаев то, что у вас есть, будет в порядке. См. Документацию для NSFetchRequest для получения дополнительной информации.

Если вы получите доступ к одному из свойств, основные данные перейдут в постоянное хранилище и получат остальные ваши значения, после чего вы получите полное описание в журналах.

Кажется, это настолько распространенное недоразумение, что я решил написать об этом здесь .

Jrturton
источник
57
вы можете отключить свойство, вызвав [request setReturnsObjectsAsFaults: NO];
Камар Сулейман
21
Неисправность сбивает с толку, они могли бы сказать «данные не получены» или что-то в этом роде
Кристи Бэлуцэ
1
Ошибка - это общее ключевое слово, используемое в архитектуре информатики
Абхишек Беди,
@AbhishekBedi нет, это не так. Это «специальное» слово, используемое Core Data специально для обозначения чего-то другого, чем обычное словарное определение. Точно плохой нейминг.
Carson Holzheimer,
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! 
}

Надеюсь, это вам поможет. :)

Рой
источник