目标C语言 属性的Getter在领域搜索/保存不工作



由于这里提到的原因,我需要创建额外的属性。我尝试使用getter,它解析原始属性的值,如下所示:

Pubs.h
@property NSString *pubname; // original property
@property NSString *pubnameDS; // extra property with diacritics stripped
.
.
- (NSString*) pubnameDS;
Pubs.m:
// it refers to property "pubname" and it does striping of diacritics
- (NSString*) pubnameDS {
    NSMutableString *string = [self.pubname mutableCopy];
    CFStringTransform((__bridge CFMutableStringRef)(string),
                      NULL, kCFStringTransformStripCombiningMarks, NO);
    return string;
}

所以这是预期的:

Pubs *p = [[Pubs alloc] init];
p.pubname = @"čulukánas";
DLog(@"%@ %@ %@", p.pubname, p.pubnameDS, [p pubnameDS]);

但是,如果我在"db"中插入数据,填充pubname属性和空pubnameDS,我希望Realm在进行搜索(或保存)时使用属性pubnameDS的getter,似乎它不像那样工作。

因为这个找到数据:

DLog(@"classic search res %lu", [[Pubs objectsWhere:@"pubname CONTAINS[c] 'club'"] count]);

但这不是:

DLog(@"classic search res %lu", [[Pubs objectsWhere:@"pubnameDS CONTAINS[c] 'club'"] count]);

顺便说一句,另外一个问题-这根本不起作用(为什么?它总是返回0个结果)

NSPredicate *pred = [NSPredicate predicateWithFormat:@"pubname CONTAINS[c] '%@'", @"club"];
DLog(@"predicate res %lu", [[Pubs objectsWithPredicate:pred] count]);

就是不能使nsprecate搜索工作,不知道是什么原因

但是回到原来的问题,Realm在搜索时不使用属性getter,所以似乎唯一的解决方案是在保存到db之前手动设置额外的属性。

可能是另一种解决方案,可以从defaultPropertyValues方法中引用原始属性值,但由于这是静态方法,我猜这不是解决方案(因为它不涉及对象的实际实例)

编辑: hmm如果我插入一个创建的对象到db,那么似乎pubnameDS也设置了,但我的情况是我通过以下方法保存数据

        id object = [self createOrUpdateInRealm:realm withJSONDictionary:dictionary];

那么就很清楚了,为什么保存时不调用getter,因为它是一般对象,而不是酒馆的实例。

Edit2

对于非功能谓词。我发现,虽然这不起作用:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"pubname CONTAINS[c] '%@'", @"club"];

这确实有效。有趣。

NSPredicate *pred = [NSPredicate predicateWithFormat:@"pubname CONTAINS[c] 'club'"];

Edit3:

这也管用,也许这是正确的方法,不知道。(省略%@周围的省略号)

pred = [NSPredicate predicateWithFormat:@"pubname CONTAINS[c] %@", @"club"];

领域0.98.6

回答你的两个问题:

  1. 查询中只能使用对象上的持久化属性。尝试使用非持久化属性(如pubnameDS)将失败,因为Realm的查询引擎无法访问该属性。
  2. NSPredicate的格式字符串的行为不同于NSString等常用格式字符串,因为它们用于构建表达式树。特别是,%@格式说明符将对象插入到表达式树中的给定点。它不像NSString那样插入字符串表示。这就是为什么你在用引号包装%@说明符时看到问题。

最新更新