核心数据NSPredicate“已删除==否”无法正常工作

我在父子上下文中使用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返回正确的结果,其中as predicateWithFormat返回所有记录。


使用predicateWithBlock代替的优点和缺点是predicateWithFormat什么?


沧海一幻觉
浏览 864回答 3
3回答

holdtom

问题是您已经deleted为实体定义了属性。这与的isDeleted方法冲突NSManagedObject,因此您应该重命名该属性。以下“实验”表明,如果您将属性称为“已删除”(c具有自定义deleted属性的托管对象),则会发生奇怪的事情:// Set custom "deleted" property to YES:c.deleted = @YES;// Use the property, as your Code 1NSLog(@"%@", [c deleted]);// Output: 1// Use Key-Value Coding, as your Code 2NSLog(@"%@", [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对象是否实际上已从上下文中删除!因此,重命名该属性应该可以解决您的问题。不幸的是,如果属性名称与内置方法冲突,则编译器不会发出警告。

杨魅力

使用格式占位符替换布尔值:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@",@"deleted", @(NO)];您可以使用键路径,但是对于解析器而言,右侧可能看起来不像“否”。

Helenr

isDeleted和Delete是两个不同的名称。当我检查NSManagedObject.h头文件时,// state - methods can be used through KVC, for example for enabling/disabling widgets based on the state of the object - (BOOL)isInserted; - (BOOL)isUpdated; - (BOOL)isDeleted;可能是苹果有一些私有属性
打开App,查看更多内容
随时随地看视频慕课网APP