ストレージに Core Data を使用している iOS アプリケーションに取り組んでいます。私のストアでは、すべてのエンティティが一意であり、既存のエンティティを渡す別のエンティティに置き換える関数を作成しています。渡すエンティティの例を次に示します。
NSManagedObjectContext *context = [[MyDB sharedInstance] managedObjectContext];
User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context];
NSNumber *userNumber = 12345;
user.id = userNumber;
user.name = @"John Doe";
user.email = @"john@doe.net";
user.createdDate = [NSDate date];
[[MyDB sharedInstance] updateUser:user];
コア データ ストレージ内には、メール アドレスが「john@doe.com」であることを除いて、同じエンティティが既にあります。現時点での私の更新は次のようになります。
-(void)updateUser:(User *)user {
NSError *error;
NSManagedObjectContext *context = [[MyDB sharedInstance] managedObjectContext];
// Create fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
// Create predicate
NSPredicate *pred = [NSPredicate predicateWithFormat:@"id == %@", user.id];
[fetchRequest setPredicate:pred];
NSArray *results = [context executeFetchRequest:fetchRequest error:&error];
if (error) {
// handle fetch error
} else {
user = [[User alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
for (User *recordToDelete in results) {
[context deleteObject:recordToDelete];//record gets deleted here, which is fine
}
[context save:&error]; //this doesn't save the new entity that I passed in
if (error) {
// handle save error
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id=%@", 12345];
[fetchRequest setPredicate:pred];
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
for (User *testObject in items) {
NSLog(@"ID: %@, Name: %@, Email: %@, Created Date: %@", [testObject id], [testObject name], [testObject email], [testObject createdDate]);
}
}
問題は、上記の関数がストア内の既存のレコードを削除することですが、それを置き換える新しいエンティティの追加に失敗することです。どうすればこれを修正できますか?