だからここに契約があります:
// A. Inserting
Item *item = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:managedObjectContext];
NSError *error = nil;
[managedObjectContext save:&error];
..
[item setItemID:@"15"];
[managedObjectContext save:&error];
NSLog(@"Error: %@", error); // outputs (null)
// B. Fetching all records
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
request.returnsObjectsAsFaults = NO;
NSArray *allItems = [managedObjectContext executeFetchRequest:request error:nil];
NSLog(@"All Items: %@", allItems);
さて、これは以前に挿入されたアイテムを含む巨大なリストを出力します:
"<Item: 0x7eb7bc0> (entity: Item; id: 0x7eb71c0 <x-coredata://BC6EB71C-47C0-4445-905D-7D42E6FC611B/Item/p2> ; data: {\n itemID = 15;\n})"
ここまでは順調ですが、この特定のアイテムが存在するかどうかを確認したいと思います (この文脈では奇妙に聞こえるかもしれませんが、ここでは本当に理にかなっています)。ただし、使用している述語は失敗します (理由はわかりません)。
// C. Fetching a single record
NSFetchRequest *singleRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
singleRequest.predicate = [NSPredicate predicateWithFormat:@"itemID == %@", @"15"];
NSError *error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:singleRequest error:&error];
NSLog(@"Error: %@", error); // outputs (null) again
NSLog(@"Results: %@", results); // outputs () ...
これを「修正」する方法がよくわかりません。
ここにいくつかの他の事実があります:
- CoreData で永続的な SQLite ストアを使用します (ほとんどのデフォルト構成であり、リレーションシップでさえなく、3 つのテーブルの単純なキーと値のみ)。
- sは
itemID
常に文字列です - アプリを再度開くと、2 番目のコード ブロックはアイテム (= 前回の実行で挿入されたアイテム) を返します。
save:
ディスクへの書き込みが非同期に行われ、ディスクに書き込まれたNSPredicate
アイテムのみがフィルター処理される可能性はありますか?
一部は別の方法で発生しますが、と とA
同じスレッドで発生します。はすぐ下にあり、両方が同じメソッドに配置されます。B
C
C
B