所以这是交易:
// 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 () ...
我真的不明白如何“解决”这个问题。
以下是其他一些事实:
itemID
始终是字符串save:
异步写入磁盘,而NSPredicate
只过滤写入磁盘的项目吗?部分A
在不同的方法中发生,但与B
和C
在同一个线程上。 C
位于B
正下方,两者都放在同一方法中。
答案 0 :(得分:0)
答案 1 :(得分:0)
好的,明白了。我在特定模型的@synthesize
文件中使用了@dynamic
而不是.m
。不知道会是这么大的问题.. :)
出于某种原因,使用@synthesize
..