4

Core Data に関する WWDC ビデオをいくつか見ましたが、正規化されたテキスト プロパティを維持することを計画しています。次のデータがあるとします。

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

モデルをクエリするとき、「normalizedString」で並べ替えて、大文字と小文字の区別と Ø (またはその他の文字) を無視したいと考えています。また、「'o' で始まる」などのクエリを実行して、上記の 3 つの単語を返すようにしたいと考えています。

私は次のようなことを避けようとしていました:

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

モデルのクエリ用。また、ソートに「originalString」を使用しようとしていました。

2 つの異なるアプローチを試しましたが成功しませんでした。正規化された文字列は引き続き originalString として保存されます (作成したカテゴリのセッターをオーバーライドします)。

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

1 に答える 1