我需要为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
答案 0 :(得分:1)
回答你的两个问题:
pubnameDS
)将失败,因为Realm的查询引擎无法访问该属性。NSPredicate
格式字符串的行为与NSString
等使用的常用格式字符串不同,因为它们用于构建表达式树。特别是,%@
格式说明符将对象插入表达式树中的给定点。它没有像NSString
那样插入字符串表示。这就是在使用引号包装%@
说明符时遇到问题的原因。