Coredata Error „data: <fault>”

107

Próbuję wyciągnąć dane z CoreData za pomocą następującego kodu

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 powinien mieć 9 pasujących obiektów i znajduje 9 obiektów. Więc predykat powinien działać, ale otrzymuję to w konsoli

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>)"
)

Kiedyś działało doskonale, dopóki nie dokonałem następującej zmiany w Cave.m, która jest Entity

Dodałem MKAnnotation jako delegata w Cave.h i dodałem ten kod w Cave.m

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

Czy istnieje sposób na debugowanie tego?

Chris
źródło

Odpowiedzi:

273

Jest to oczekiwane zachowanie, podstawowe dane nie zwrócą pełnych obiektów, dopóki nie będziesz potrzebować dostępu do trwałych wartości obiektów. Do tego momentu każdy ze zwróconych obiektów będzie „błędem”.

Możesz zmusić żądanie pobrania do zwrócenia pełnych obiektów przy użyciu [request setReturnsObjectsAsFaults:NO], ale w większości przypadków to, co masz, będzie w porządku. Więcej informacji można znaleźć w dokumentacji dotyczącej NSFetchRequest.

Jeśli uzyskasz dostęp do jednej z właściwości, podstawowe dane trafią do magazynu trwałego i pobiorą resztę wartości, a następnie w dziennikach pojawi się pełny opis.

Wydaje się, że jest to tak powszechne nieporozumienie, że postanowiłem o tym napisać tutaj .

jrturton
źródło
57
możesz wyłączyć tę właściwość, wywołując [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman,
21
Błąd jest mylący, mogli powiedzieć
``
1
Fault to ogólne słowo kluczowe używane w architekturze informatyki
Abhishek Bedi
@AbhishekBedi nie, nie jest. Jest to „specjalne” słowo, które zostało użyte specjalnie przez Core Data i oznacza coś innego niż zwykła definicja słownikowa. Na pewno złe nazewnictwo.
Carson Holzheimer,
4

Napotkałem ten sam problem podczas pobierania danych z CoreData! Tak więc postępowałem zgodnie z instrukcją @jrturton i zaimplementowałem ją w Swift 3 :

Krok 1: Dodaj import CoreData

Krok 2: Dodaj poniższy kod. .

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

Mam nadzieję, że to ci pomoże. :)

Roy
źródło