4

私の CoreData オブジェクトには、name 属性があり、単なる文字列です。ユーザーが同じ「名前」属性を持つ2つのオブジェクトを保存するのを止めるためにチェックできる自動化された方法またはボックスはありますか? それとも、これを手動で確認しますか?

ありがとう。

4

2 に答える 2

3

キー値検証(KVV)を使用します。-validateName:error:エンティティのクラスにメソッドを追加します。そのメソッドでは、同じ名前のオブジェクトのフェッチを実行できます。見つかった場合、入力された名前はデータ ストア内で一意ではないため、エラーを返します。

于 2012-04-05T22:09:01.027 に答える
2

残念ながら、コア データの重複データを防止するためのチェック ボックスや自動化されたシステムはありません。したがって、自分で処理する必要があります..実装は簡単です。

が既に存在するかどうかにかかわらず、検索を実行するには、NSPredicateと組み合わせて使用​​する必要があります。入力した がすでに存在する場合は、カウントが 0 よりも大きくなるため、重複したエントリは許可されません。重複エントリが見つからない場合は <1 なので、エントリを許可します。次のようなコードを試してください。fetchedResultsControllernamenamefetchedResultsController.fetchedObjectsfetchedResultsController.fetchedObjects

  - (IBAction)saveName
  {
    NSLog(@"saveArtistInformation");
    NSError *error = nil;

  // We use an NSPredicate combined with the fetchedResultsController to perform the search
if (self.nameText.text !=nil)
{
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name contains[cd] %@", self.nameText.text];
    [fetchedResultsController.fetchRequest setPredicate:predicate];
}

if (![[self fetchedResultsController] performFetch:&error])
{
    // Handle error
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    exit(-1);  // Fail
}

// compare `fetchedResultsController`'s count if its <1 allow insertion

if ([fetchedResultsController.fetchedObjects count] < 1)
{
    NSLog(@"Found that Artist already in Core Data");
    Entity *entity = (Entity *)[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];
    entity.name = self.nameText.text;

    //call save method

    if (![managedObjectContext save:&error])
    {
        NSLog(@"Problem saving: %@", [error localizedDescription]);
    }
}
else
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Name  already exists" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
    [alert release];
}

礼儀:TheAppCodeBlog

于 2012-04-05T21:55:16.277 に答える