核心数据NSPredicate“deleted == NO”不按预期工作
我在父子上下文中使用UIManagedDocument。
在我的孩子的情况下,我做了以下
代码1
NSSet *results = [self.event.memberships filteredSetUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return ([[evaluatedObject deleted] boolValue] == NO);
}]];
上面的代码返回预期的结果(只有未被删除的事件成员)。
代码2
但是这段代码没有。 它提取所有记录。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
NSSet *results = [self.event.memberships filteredSetUsingPredicate:predicate];
这似乎令人困惑。 两者都应该返回相同的结果,但是predicateWithBlock
返回正确的结果,因为predicateWithFormat
返回所有记录。
使用predicateWithBlock
而不是predicateWithFormat
什么优点和缺点?
问题是你已经定义了一个为你的实体deleted
的属性。 这与NSManagedObject
的isDeleted
方法冲突,所以你应该重命名该属性。
下面的“实验”表明,如果您将属性“删除”( c
是具有自定义deleted
属性的托管对象),会发生奇怪的事情:
// Set custom "deleted" property to YES:
c.deleted = @YES;
// Use the property, as your Code 1
NSLog(@"%@", [c deleted]);
// Output: 1
// Use Key-Value Coding, as your Code 2
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 0
// Now really delete the object and try again:
[context deleteObject:c];
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 1
您的“代码1”是指该财产,因此它返回预期的结果。 “代码2”使用键值编码,如果对象实际上已从上下文中删除, [c valueForKey:@"deleted"]
返回YES
!
所以重命名该属性应该可以解决您的问题。 不幸的是,如果属性名称与内置方法冲突,编译器不会发出警告。
使用格式化占位符替换bool值:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"deleted", @(NO)];
您使用的关键路径可能是好的,但右侧可能不像解析器的“否”。
链接地址: http://www.djcxy.com/p/36117.html上一篇: Core Data NSPredicate "deleted == NO" does not work as expected
下一篇: NSFetchedResultsController group into sections for every 4 hours