Coredataエラー「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のドキュメントをご覧ください。

プロパティの1つにアクセスすると、コアデータが永続ストアに移動し、残りの値をフェッチすると、完全な説明がログに記録されます。

これはよくある誤解のようであり、私はそれについてここに書くことにしました


57
プロパティをオフにするには、[request setReturnsObjectsAsFaults:NO]を呼び出します。
カマルスレイマン

21
障害は紛らわしい、彼らは「データがフェッチされなかった」または何かを言ったかもしれない
Cristi Băluță

1
障害は、コンピュータサイエンスアーキテクチャで使用される一般的なキーワードです
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.