私はこの問題を処理するためのより良い選択肢を探しています。CoreDataでNSManagedObjectの一意のラベルを選択する
CoreDataモデルでは、ProjectというNSManagedObjectがあります。そのサブクラスでは、アクセッサメソッド(setter)のlabel属性をオーバーライドします。ここでは、同じラベルがすでに使用されているかどうかを確認します。そうであれば、ラベルにアンダースコアと数字を追加します(例: "MyProject"は "MyProject_1"に名前が変更されます。もちろん、私はラベル "MyProject"または "MyProject _" +番号を見つけるかどうかをチェックする必要があります。私はそれを正規表現で行います。
NSString *regexString = [NSString stringWithFormat:@"%@_[0-9]+", value];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(label = %@) OR (label MATCHES %@)", value, regexString];
[request setPredicate:predicate];
それから私は、5を言うことができますので、私は次のHASTは「MyProject_6」と呼ばれるようにすることを知って、多くの結果をフェッチしているか確認してください。
それが正常に動作しますが、あなたはおそらくすでにこのコードに少し問題があることに気づいた:私は、次のラベルを持っている場合は何が起こる:
MyProject_1、MyProject_2、MyProject_3
とユーザーが決定プロジェクトMyProject_55を呼び出します。 私の検索では4つの要素が検索され、次のプロジェクトはMyProject_4ではなくMyProject_5というラベルが付けられます。そしてそれが悪いことは、ある時点で、私は2つのMyProject_55を持つことになります。私はそれが起こる可能性は低いことを知っていますが、それは:)することができます。
何か良いアイデアはありますか?ここで
は、アクセサメソッドは
#pragma mark - Setter for label
- (void)setLabel:(NSString *)aLabel
{
if ([[self primitiveValueForKey:@"label"] isEqualToString:aLabel])
{
return;
}
NSMutableArray *objects = [self fetchObjectsWithValueEqualTo:aLabel];
NSUInteger objectsCount = [objects count];
aLabel = objectsCount > 0 ? [NSString stringWithFormat:@"%@_%d",aLabel, objectsCount] : aLabel;
[self willChangeValueForKey:@"label"];
[self setPrimitiveValue:aLabel forKey:@"label"];
[self didChangeValueForKey:@"label"];
}
明らかに何かを監督していなかったことを知っておいてよかったです。私は再フェッチを避けようとしていましたが、他に解決策がない場合は、そのようにします。ありがとう! –
これについて考えてみると、新しいラベルが存在するかどうかを確認するために、現在のフェッチを繰り返し処理する別の方法があります。しかし、CDはかなり安いですが、これはセットでしかありません。それはうまくいかなければなりません。 –
あなたの最後のコメントのおかげで、私はすべてを再加工しました。今私はフェッチされた結果をチェックし、それに応じてラベルの名前を再帰的な関数があります。私は多くのことを修正しなければならなかった。私は多くのユースケースを無視していました。 –