Kesalahan Coredata “data: <fault>”

107

Saya mencoba menarik data dari CoreData dengan kode berikut

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 harus memiliki 9 objek yang cocok dan menemukan 9 objek tersebut. Jadi predikatnya harus berfungsi tetapi saya mendapatkan ini di konsol

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

Dulu bekerja dengan sangat baik sampai saya melakukan perubahan berikut di Cave.m yang merupakan Entitas

Saya menambahkan MKAnnotation sebagai delegasi di Cave.h dan menambahkan kode ini di Cave.m

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

Apakah ada cara untuk men-debug ini?

Chris
sumber

Jawaban:

273

Ini adalah perilaku yang diharapkan, data inti tidak akan mengembalikan objek penuh sampai Anda perlu mengakses nilai objek yang persisten. Setiap objek yang Anda kembalikan akan menjadi 'kesalahan' sampai saat ini.

Anda dapat memaksa permintaan pengambilan untuk mengembalikan objek penuh menggunakan [request setReturnsObjectsAsFaults:NO], tetapi dalam banyak kasus apa yang Anda miliki akan baik-baik saja. Lihat dokumentasi NSFetchRequest untuk informasi lebih lanjut.

Jika Anda mengakses salah satu properti, data inti akan masuk ke penyimpanan persisten dan mengambil sisa nilai Anda, lalu Anda akan mendapatkan deskripsi lengkap di log.

Ini sepertinya kesalahpahaman yang umum sehingga saya memutuskan untuk menulis tentang itu, di sini .

jrturton.dll
sumber
57
Anda bisa mematikan properti dengan memanggil [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman
21
Kesalahan membingungkan, mereka bisa mengatakan 'data tidak diambil' atau semacamnya
Cristi Băluță
1
Fault adalah kata kunci generik yang digunakan dalam arsitektur ilmu komputer
Abhishek Bedi
@AbishekBedi tidak. Ini adalah kata "khusus" yang digunakan secara khusus oleh Core Data untuk mengartikan sesuatu yang berbeda dari definisi kamus normal. Penamaan yang buruk pasti.
Carson Holzheimer
4

Saya menghadapi masalah yang sama saat menarik data dari CoreData! Jadi, saya mengikuti cara @jrturton menginstruksikan dan menerapkannya di Swift 3 :

Langkah 1: Tambahkan import CoreData

Langkah 2: Tambahkan kode di bawah ini. .

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

Semoga bisa membantu Anda. :)

roy
sumber