所以這裏的交易:NSPredicate(==比較數字字符串)不工作
// 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臺只是普通的鍵值)。
itemID
s總是字符串- 重新打開應用程序時,第二個代碼塊確實會返回一個項目(=在上一次運行中插入的項目)。難道是異步寫入磁盤,並且
NSPredicate
只過濾寫入磁盤的項目?
部分A
在不同的方法會發生,但在同一個線程B
和C
。 C
直接低於B
,並且兩者都以相同的方法放置。
s o你說B部分一直工作(包括多次),但C部分只在重新啓動應用程序後才起作用? – 2012-07-29 18:31:38
是的,B始終工作,並且還返回插入A部分的新項目(仍處於同一「運行」中)。在第一次運行中,這是'#15',第二次運行'#16'等等。當第二次運行時,我可以在部分C中查詢'#15',但是我不能查詢'#16'。在第二次運行中查詢B部分中的所有項目,同時返回'#15'和'#16'。 – elslooo 2012-07-29 18:36:08