2012-07-29 73 views
0

所以這裏的交易: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在不同的方法會發生,但在同一個線程BCC直接低於B,並且兩者都以相同的方法放置。

+0

s o你說B部分一直工作(包括多次),但C部分只在重新啓動應用程序後才起作用? – 2012-07-29 18:31:38

+0

是的,B始終工作,並且還返回插入A部分的新項目(仍處於同一「運行」中)。在第一次運行中,這是'#15',第二次運行'#16'等等。當第二次運行時,我可以在部分C中查詢'#15',但是我不能查詢'#16'。在第二次運行中查詢B部分中的所有項目,同時返回'#15'和'#16'。 – elslooo 2012-07-29 18:36:08

回答

0

如果你比較字符串,試試這個:

@"itemID LIKE %@" 

擁有read of this中,標題爲「字符串比較」

+0

不會這樣做:。除此之外,在重新啓動應用程序後搜索到之前插入的'itemID',對嗎?==沒有任何意義,對吧? – elslooo 2012-07-29 17:43:04

0

好了它,我在特定型號的使用@synthesize代替@dynamic.m -file。不知道這會是一個很大的問題.. :) 出於某種原因,使用@synthesize時出現SQLite數據庫更新錯誤..