0

2 つの属性「uid」、「description」を持つ「ItemModel」と呼ばれる 90 個の CoreData エンティティがあり、各項目は NSManagedObject として挿入されます。

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName: @"ItemModel" inManagedObjectContext: AFYDelegate.managedObjectContext];

最初のサーバー呼び出しは、キー「uid」に対して上記で取得した 90 個のアイテムのそれぞれに「uid」を割り当てます。コンテキストはここには保存されません。

後の 2 回目のサーバー呼び出しで、indexPath を使用して NSManagedObjectごとに90 項目の「説明」を更新するのが好きです。各オブジェクトを取得して次のメソッドに渡し、コンテキストを保存します。

[self updateItemToDataModel:object withData: description];

....
....

- (void)updateItemToDataModel:(NSManagedObject *) object withData:(NSString *)data
{   
    [object setValue:data  forKey:@"description"];

    NSError * error = nil;
    if (![self.managedObjectContext save:&error]) {
       //Handle any error with the saving of the context
       NSLog(@"%@",error.localizedDescription);
    }
}

上記は CoreData の更新では正常に機能しますが、シミュレーターを閉じてコードを再度実行した後、同じ「uid」と「description」を持つアイテムごとに 2 つの重複があります。これは、現在 180 個のアイテムがあることを意味します。コードを繰り返し閉じて実行すると、ますます多くのアイテムが作成されます。

updateItemToDataModel メソッドを削除して、シミュレーターをリセットしてみましたが、90 個のアイテムで正常に動作します。

誰かが助けてくれれば、CoreData は初めてです。既存のアイテムのみを更新したい場合、コードの何が問題になっていますか?

4

1 に答える 1

1

フェッチを実行して更新するオブジェクトの既存のインスタンスを見つけるのではなく、毎回新しいオブジェクトを MOC (管理対象オブジェクト コンテキスト) に挿入しています。

既存のオブジェクトを取得するには、次のような取得リクエストを実行できます...

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"uid == %@", uidToMatch];
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate:predicate];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"ItemModel" inManagedObjectContext:managedObjectContext]];
NSError * error = nil;
NSArray * results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if ([results count]) {
    // you may need to handle more than one match in your code...
    // you could also set a fetch limit of 1 and guarantee you only get the first object, eg: [fetchRequest setFetchLimit:1];
}
else {
    // no results
}

ヘルパー関数でラップして、再利用できるようにすることもできます。そして、NSFetchRequest、NSPredicate、書き込み述語を読んで、より洗練されたフェッチ要求を行います。

于 2013-07-09T04:39:52.127 に答える