【发布时间】:2013-06-29 09:34:27
【问题描述】:
我已经观看了一些关于 Core Data 的 WWDC 视频,并且我计划维护一个规范化的文本属性。 假设我有以下数据:
originalString normalizedString (+lowercase?)
Ønsker onsker
onsker onsker
Onsker onsker
当我查询我的模型时,我想按“normalizedString”对其进行排序,以便它忽略大小写和 Ø(或其他字符)。我还希望能够运行“以 'o' 开头”之类的查询并让它返回上面的 3 个单词。
我试图避免做类似的事情:
[NSPredicate predicateWithFormat:@"(originalString like[cd] %@)"...
用于查询模型。 我还尝试使用“originalString”进行排序。
我尝试了两种不同的方法都没有成功,我的规范化字符串仍然保存为 originalString(我在我创建的类别中覆盖了 setter):
-
调用decomposedStringWithCanonicalMapping:
// ... [normalizedString decomposedStringWithCanonicalMapping]; // ... -
已关注this example:
// ... CFStringNormalize((CFMutableStringRef)normalizedString, kCFStringNormalizationFormD); CFStringFold((CFMutableStringRef)normalizedString, kCFCompareCaseInsensitive | kCFCompareDiacriticInsensitive | kCFCompareWidthInsensitive, NULL);
关于如何实现我的目标有什么想法吗?
编辑: 这是我的重写设置器,我知道它会被调用:
- (void) setNormalizedName:(NSString *)newNormalizedName
{
NSMutableString *normalizedString;
if (![self.lastName length] == 0) {
normalizedString = [NSMutableString stringWithString:self.lastName];
} else {
normalizedString = [NSMutableString stringWithString:self.firstName];
}
// CFStringNormalize((CFMutableStringRef)normalizedString, kCFStringNormalizationFormD);
// CFStringFold((CFMutableStringRef)normalizedString, kCFCompareCaseInsensitive | kCFCompareDiacriticInsensitive | kCFCompareWidthInsensitive, NULL);
[normalizedString decomposedStringWithCanonicalMapping];
[self willChangeValueForKey:@"normalizedName"];
[self setPrimitiveValue:normalizedString forKey:@"normalizedName"];
[self didChangeValueForKey:@"normalizedName"];
}
【问题讨论】:
-
请显示您的自定义setter方法的代码。我不明白为什么这不起作用。
-
@MartinR 我已经编辑了我的问题以包含我的 setter 方法。
标签: iphone ios objective-c core-data