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 个表中的普通键值)。
  • sitemID总是字符串
  • 重新打开应用程序时,第二个代码块确实返回一个项目(= 上一次运行中插入的项目)。会不会是save:异步写入磁盘,并且NSPredicate只有过滤器项写入磁盘?

部分以不同的方法发生,但与andA发生在同一线程上。就在下面,两者都放在同一个方法中。BCCB

4

2 回答 2

0

如果您正在比较字符串,请尝试以下操作:

@"itemID LIKE %@"

阅读这个,标题为“字符串比较”的部分

于 2012-07-29T17:39:46.407 回答
0

好,知道了。我在特定模型的-file中使用@synthesize而不是。不知道这会是个大问题.. :) 出于某种原因,使用..时更新 SQLite 数据库出错了@dynamic.m@synthesize

于 2012-07-29T19:29:55.737 回答