Lỗi Coredata “data: <fault>”


107

Tôi cố gắng lấy ra dữ liệu từ CoreData bằng mã sau

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 phải có 9 đối tượng phù hợp và nó tìm thấy 9 đối tượng. Vì vậy, vị từ sẽ hoạt động nhưng tôi nhận được điều này trong bảng điều khiển

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

Nó đã từng hoạt động hoàn toàn tốt cho đến khi tôi thực hiện thay đổi sau đây trong Cave.m, đó là Thực thể

Tôi đã thêm MKAnnotation làm đại biểu trong Cave.h và thêm mã này trong Cave.m

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

Có cách nào để gỡ lỗi này không?

Câu trả lời:


273

Đây là hành vi được mong đợi, dữ liệu cốt lõi sẽ không trả về các đối tượng đầy đủ cho đến khi bạn cần truy cập các giá trị liên tục của các đối tượng. Mỗi đối tượng trả về của bạn sẽ là một 'lỗi' cho đến thời điểm này.

Bạn có thể buộc yêu cầu tìm nạp trả về các đối tượng đầy đủ bằng cách sử dụng [request setReturnsObjectsAsFaults:NO], nhưng trong hầu hết các trường hợp, những gì bạn có sẽ ổn. Xem tài liệu về NSFetchRequest để biết thêm thông tin.

Nếu bạn truy cập một trong các thuộc tính, dữ liệu cốt lõi sẽ được chuyển đến kho lưu trữ liên tục và tìm nạp phần còn lại của các giá trị của bạn, sau đó bạn sẽ nhận được mô tả đầy đủ trong nhật ký.

Đây dường như là một sự hiểu lầm phổ biến đến nỗi tôi quyết định viết về nó, tại đây .


57
bạn có thể tắt thuộc tính bằng cách gọi [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman

21
Lỗi là khó hiểu, họ có thể nói 'dữ liệu không lấy' hoặc một cái gì đó
Cristi Băluţă

1
Lỗi là một từ khóa chung chung được sử dụng trong kiến trúc khoa học máy tính
Abhishek Bedi

@AbhishekBedi không, không phải vậy. Đó là một từ "đặc biệt" được Core Data sử dụng đặc biệt để có nghĩa khác với định nghĩa từ điển thông thường. Chắc chắn là đặt tên xấu.
Carson Holzheimer

4

Tôi gặp phải vấn đề tương tự khi lấy dữ liệu từ CoreData! Vì vậy, tôi đã làm theo cách @jrturton hướng dẫn và triển khai nó trong Swift 3 :

Bước 1: Thêm import CoreData

Bước 2: Thêm mã bên dưới. .

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

Hy vọng, nó sẽ giúp ích cho bạn. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.