为核心数据规范化或规范化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的类别):

  1. 调用decomposedStringWithCanonicalMapping:

     // ... [normalizedString decomposedStringWithCanonicalMapping]; // ... 
  2. 遵循这个例子 :

     // ... 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"]; } 

您应该覆盖“主要”属性(例如firstNamelastName )的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; }