2013-07-02 82 views
4

我已经观看了Core Data上的一些WWDC视频,并且计划维护一个规范化的文本属性。 比方说,我有以下数据:为核心数据规范化或规范化字符串?

originalString    normalizedString (+lowercase?) 
Ønsker      onsker 
onsker      onsker 
Onsker      onsker 

当我询问我的模型,我想通过“规格化”进行排序,以便它忽略的情况和O(或其它字符)。我也希望能够运行一个查询,如“开始于'o'”,并让它返回上面的3个单词。

我试图避免做一些事情,如:查询模型

[NSPredicate predicateWithFormat:@"(originalString like[cd] %@)"... 

。 我也在尝试为我的排序使用'originalString'。

我试过没有成功两种不同的方法,我的规范化字符串仍然保存为originalString(我重写我创建了一个类的setter):

  1. 调用decomposedStringWithCanonicalMapping:

    // ... 
    [normalizedString decomposedStringWithCanonicalMapping]; 
    // ... 
    
  2. 其次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"]; 
} 
+0

请出示您的自定义setter方法的代码。我不明白为什么这不应该工作。 –

+0

@MartinR我编辑了我的问题以包含我的setter方法。 – Eric

回答

0

您应该重写setter方法“主”的特性(例如firstNamelastName),而不是引领者“派生”财产。

另请注意,decomposedStringWithCanonicalMapping返回一个新字符串,它不会 修改接收器。

代码可以大致是这样的(未编译器检查):

- (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; 
} 
+0

这就是我想要做的,但我重写setFirstName,setLastName和setNormalizedName,所以我可能在那里创建了一个问题。我会再次尝试使用这个新方法'updateNormalizedName'。一旦我开始测试,我会将您的答案标记为正确。 – Eric

+0

我试着做你所建议的,但decomposedStringWithCanonicalMapping返回相同的字符串。我添加了上面的注释行,但只是将Ønsker转换为ønsker。我希望让恩斯克能够成为现实。 任何想法? – Eric

+0

@Eric:正如我现在看到的,我的答案更关注“如何为规范化属性编写setter”,但这并不能解决“如何规范化Øto o”的具体问题。 - 这可能是后者是不可能的,比较http://stackoverflow.com/questions/16836975/ios-cfstringtransform-和类似的问题和http://stackoverflow.com/questions/9376621/folding-normalizing-为了可能的解释,可以使用连字 - 例如-ea-using-corefoundation。 –