iOS 核心数据谓词:如何谓词基元值



我有一个讨厌的问题。在 coredata 中,我有一个名为"类别"的实体,我想要一个默认类别,用户无法删除、编辑等。此默认类别称为"0_default_category"(存储在常量 kSettingsLocalizedDefaultCategory 中),当向用户显示时,此名称将替换为本地化字符串。为此,我覆盖了getter:

-(NSString *)name
{
    if([[self primitiveValueForKey:@"name"] isEqualToString:kSettingsLocalizedDefaultCategory]){
        return NSLocalizedString(kSettingsLocalizedDefaultCategory, nil);
    } else {
        return [self primitiveValueForKey:@"name"];
    }
}

现在我当然想在常量上使用谓词,而不是本地化字符串!但这在本地化字符串上使用谓词(所以我的 getter 被调用,我不想要......

request.predicate = [NSPredicate predicateWithFormat:@"name != %@", kSettingsLocalizedDefaultCategory];

知道我如何预测原始值吗?

我认为您将两个单独的问题混为一谈。一个事实是,您有一些特殊的逻辑(您的常量)来自动显示本地化字符串。另一种是返回存储在属性name中的值。

理想情况下,应将这两个分开,以明确这两个问题。因此,您不应该重写 name 的 getter,而应该创建一个具有不同名称的自定义方法(或派生属性,根据您的需要)。

-(NSString*)displayName {
   return [self.name isEqualToString:kConstant] ? 
    NSLocalizedString(kConstant) : self.name;
}

如果要使用自定义逻辑显示名称,请使用 displayName,并将谓词保留为

[NSPredicate predicateWithFormat:@"name != %@", kConstant];

最新更新