Erro Coredata “dados: <fault>”

107

Tento extrair dados de CoreData com o seguinte código

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 deve ter 9 objetos correspondentes e encontra os 9 objetos. Então, o predicado deve funcionar, mas eu pego isso no console

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

Costumava funcionar perfeitamente bem até que fiz a seguinte alteração em Cave.m que é a Entidade

Eu adicionei MKAnnotation como um delegado em Cave.h e adicionei este código em Cave.m

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

Existe uma maneira de depurar isso?

Chris
fonte

Respostas:

273

Este é o comportamento esperado, os dados principais não retornarão objetos completos até que você precise acessar os valores persistentes dos objetos. Cada um de seus objetos devolvidos será uma 'falha' até este ponto.

Você pode forçar a solicitação de busca para retornar objetos completos usando [request setReturnsObjectsAsFaults:NO], mas na maioria dos casos o que você tiver estará bem. Consulte a documentação de NSFetchRequest para obter mais informações.

Se você acessar uma das propriedades, os dados principais irão para o armazenamento persistente e buscarão o restante de seus valores, então você obterá a descrição completa nos logs.

Este parece ser um mal-entendido tão comum que resolvi escrever sobre isso aqui .

Jrturton
fonte
57
você pode desativar a propriedade chamando [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman
21
A falha é confusa, eles poderiam ter dito 'dados não obtidos' ou algo assim
Cristi Băluță
1
Falha é uma palavra-chave genérica usada na arquitetura da ciência da computação
Abhishek Bedi
@AbhishekBedi não, não é. É uma palavra "especial" usada especificamente por Core Data para significar algo diferente da definição normal do dicionário. Má nomenclatura, com certeza.
Carson Holzheimer
4

Eu enfrentei o mesmo problema ao extrair dados do CoreData! Então, eu segui a forma como @jrturton instruiu e implementei no Swift 3 :

Etapa 1: adicionar import CoreData

Etapa 2: adicione o código abaixo. .

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

Espero que ajude você. :)

Roy
fonte