核心数据NSPredicate“删除== NO”不按预期工作(Core Data NSPredica

2019-08-23 00:09发布

我使用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

Answer 1:

问题是,你已经定义的属性deleted了你的实体。 这与冲突isDeleted的方法NSManagedObject ,所以你应该重命名属性。

下面的“实验”表明,奇怪的事情,如果你打电话给你的属性为“删除”的发生( 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如果对象实际上已经从上下文中删除!

因此,重命名该属性应该解决您的问题。 不幸的是,如果属性名称与内置方法的冲突,编译器不会发出警告。



Answer 2:

使用格式化占位符替换布尔值:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"deleted", @(NO)];

您使用的关键路径的可能是好的,但在右边可能看起来并不像“否”的解析器。



文章来源: Core Data NSPredicate “deleted == NO” does not work as expected