为核心数据规范化或规范化string?
我已经观看了Core Data上的一些WWDCvideo,并计划维护一个规范化的文本属性。 假设我有以下数据:
originalString normalizedString (+lowercase?) Ønsker onsker onsker onsker Onsker onsker
当我查询我的模型时,我想通过'normalizedString'对它进行sorting,以便忽略大小写和Ø(或其他字符)。 我也希望能够运行一个查询,如“以o开头”,并返回上面的3个字。
我试图避免做一些事情:
[NSPredicate predicateWithFormat:@"(originalString like[cd] %@)"...
查询模型。 我也试图使用'originalString'进行sorting。
我已经尝试了两种不同的方法没有成功,我规范化的string仍然保存为originalString(我重写setter我创build的类别):
-
调用decomposedStringWithCanonicalMapping:
// ... [normalizedString decomposedStringWithCanonicalMapping]; // ...
-
遵循这个例子 :
// ... 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"]; }
您应该覆盖“主要”属性(例如firstName
, lastName
)的setter,而不是“derived”属性的setter。
另外请注意, decomposedStringWithCanonicalMapping
返回一个新的string ,它不会修改接收器。
代码大致看起来像这样(不检查编译器):
- (void) setFirstName:(NSString *)firstName { [self willChangeValueForKey:@"firstName"]; [self setPrimitiveValue:firstName forKey:@"firstName"]; [self didChangeValueForKey:@"firstName"]; [self updateNormalizedName]; } - (void) setLastName:(NSString *)lastName { [self willChangeValueForKey:@"lastName"]; [self setPrimitiveValue:lastName forKey:@"lastName"]; [self didChangeValueForKey:@"lastName"]; [self updateNormalizedName]; } - (void) updateNormalizedName { NSString *normalizedString; if ([self.lastName length] > 0) { normalizedString = [self.lastName decomposedStringWithCanonicalMapping]; } else { normalizedString = [self.firstName decomposedStringWithCanonicalMapping]; } self.normalizedString = normalizedString; }