Core Data に関する WWDC ビデオをいくつか見ましたが、正規化されたテキスト プロパティを維持することを計画しています。次のデータがあるとします。
originalString normalizedString (+lowercase?)
Ønsker onsker
onsker onsker
Onsker onsker
モデルをクエリするとき、「normalizedString」で並べ替えて、大文字と小文字の区別と Ø (またはその他の文字) を無視したいと考えています。また、「'o' で始まる」などのクエリを実行して、上記の 3 つの単語を返すようにしたいと考えています。
私は次のようなことを避けようとしていました:
[NSPredicate predicateWithFormat:@"(originalString like[cd] %@)"...
モデルのクエリ用。また、ソートに「originalString」を使用しようとしていました。
2 つの異なるアプローチを試しましたが成功しませんでした。正規化された文字列は引き続き originalString として保存されます (作成したカテゴリのセッターをオーバーライドします)。
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"];
}