在Realm搜索/保存的财产吸引力不起作用?

时间:2016-07-01 08:29:35

标签: objective-c realm

我需要为here提到的原因创建额外的属性。我尝试使用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]);

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

因为这会找到数据:

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]);

简直无法让NSPredicate搜索工作,不知道是什么原因。

但回到最初的问题,Realm在搜索时不使用getter作为属性,因此似乎唯一的解决方案是在保存到db之前手动设置额外属性。

可能是另一个解决方案可能是从defaultPropertyValues方法引用原始属性值,但因为那是静态方法,我猜不是解决方案(因为它不引用对象的实际实例)

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

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

然后很明显,为什么不调用getter,因为它是保存时的一般对象,而不是Pubs的实例。

EDIT2

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

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

这确实有效。有趣。

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

EDIT3:

这也有效,也许这是正确的方法,不知道。 (省略%@周围的aphostrophes)

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

境界0.98.6

1 个答案:

答案 0 :(得分:1)

回答你的两个问题:

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