NSPredicate(==与数字字符串的比较)不起作用

时间:2012-07-29 17:36:02

标签: objective-c core-data

所以这是交易:

// 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 () ...

我真的不明白如何“解决”这个问题。

以下是其他一些事实:

  • 将持久的SQLite存储与CoreData一起使用(几乎是默认配置,甚至不是关系,只是3个表中的普通键值)。
  • itemID始终是字符串
  • 重新打开应用程序时,第二个代码块会返回一个项目(=在上一次运行中插入的项目)。可能是save:异步写入磁盘,而NSPredicate只过滤写入磁盘的项目吗?

部分A在不同的方法中发生,但与BC在同一个线程上。 C位于B正下方,两者都放在同一方法中。

2 个答案:

答案 0 :(得分:0)

如果您要比较字符串,请尝试以下方法:

@"itemID LIKE %@"

有一个read of this,标题为“字符串比较”的部分

答案 1 :(得分:0)

好的,明白了。我在特定模型的@synthesize文件中使用了@dynamic而不是.m。不知道会是这么大的问题.. :) 出于某种原因,使用@synthesize ..

时更新SQLite数据库会出错