0

だからここに契約があります:

// 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同じスレッドで発生します。はすぐ下にあり、両方が同じメソッドに配置されます。BCCB

4

2 に答える 2

0

文字列を比較している場合は、これを試してください:

@"itemID LIKE %@"

これを読んで、「文字列比較」というタイトルのセクションを読んでください。

于 2012-07-29T17:39:46.407 に答える
0

わかりました。特定のモデルのファイルの@synthesize代わりに使用しました。それがそんなに大きな問題になるとは知らなかった.. :) 何らかの理由で、..@dynamic.m@synthesize

于 2012-07-29T19:29:55.737 に答える