Помилка 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, яка є Єдністю

Я додав 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 для отримання додаткової інформації.

Якщо ви отримаєте доступ до однієї з властивостей, основні дані надійдуть у постійний магазин і отримають решту ваших значень, тоді ви отримаєте повний опис у журналах.

Це здається таким поширеним непорозумінням, що я вирішив написати про це тут .


57
ви можете вимкнути властивість, зателефонувавши [request setReturnsObjectsAsFaults: NO];
Камар Сулейман

21
Помилка заплутана, вони могли сказати "дані не отримані" чи щось таке
Крісті Балуша

1
Fault - це загальне ключове слово, яке використовується в архітектурі інформатики
Abhishek Bedi

@AbhishekBedi ні, це не так. Це "особливе" слово, яке використовується спеціально основними даними для позначення чогось іншого, ніж звичайне визначення словника. Погано називати точно.
Карсон Хольцхаймер

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! 
}

Сподіваюся, це вам допоможе. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.