为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2020-02-03 12:49:33
我在父子上下文中使用UIManagedDocument。在我的孩子的情况下,我执行以下操作代码1NSSet *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什么?
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

问题是您已经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对象是否实际上已从上下文中删除!


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


查看完整回答
反对 回复 2020-02-03
?
杨魅力

TA贡献1811条经验 获得超5个赞

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


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@",

@"deleted", @(NO)];


您可以使用键路径,但是对于解析器而言,右侧可能看起来不像“否”。


查看完整回答
反对 回复 2020-02-03
?
Helenr

TA贡献1780条经验 获得超3个赞

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;可能是苹果有一些私有属性

查看完整回答
反对 回复 2020-02-03
  • 3 回答
  • 0 关注
  • 859 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信