Coredata Error“ 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 ซึ่งเป็นเอนทิตี

ฉันเพิ่ม 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];
Qamar Suleiman

21
ข้อผิดพลาดทำให้เกิดความสับสนพวกเขาอาจพูดว่า 'ไม่ได้ดึงข้อมูล' หรืออะไรบางอย่าง
Cristi Băluță

1
Fault เป็นคำหลักทั่วไปที่ใช้ในสถาปัตยกรรมวิทยาศาสตร์คอมพิวเตอร์
Abhishek Bedi

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

หวังว่ามันจะช่วยคุณได้ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.