所以这是交易:
// 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
总是字符串 - 重新打开应用程序时,第二个代码块确实返回一个项目(= 上一次运行中插入的项目)。会不会是
save:
异步写入磁盘,并且NSPredicate
只有过滤器项写入磁盘?
部分以不同的方法发生,但与andA
发生在同一线程上。就在下面,两者都放在同一个方法中。B
C
C
B