コア データ エンティティが一意であるかどうかを判断することについて多くの議論があったことは知っていますが、人々が投げ出したさまざまな解決策を理解するのに苦労しています。うまくいけば、誰かが私に簡単な解決策を提供してくれます。
状況:
基本的に多対多の関係 (イベント -> 出席者 <- 人) であるエンティティがあります。People はアドレス帳のエントリへの参照です (私は AddressBookID、firstName、lastName、および createdOn の日付を People エンティティに格納しています)。イベント テーブルには、イベントに関する詳細が表示されます。参加者テーブルには、Event (イベント) と People (人) との関係と、並べ替えのための createdOn 日付があります。
問題: 出席者のレコードを挿入する前に、ユーザーがイベントに人物を追加したかどうかを確認したい。
従来のデータベースでは、一意のキー制約を作成します。複製を挿入しようとすると、エラーがスローされ、それをトラップして先に進みます (既存のレコードを最新のデータで更新する可能性があります)。
私は次のことを試しました:
#pragma mark - Selected People Delegate
-(void)returnPeople:(NSMutableArray *)selectedPeople
{
NSError *error = nil;
Attendee *newAttendee;
for (Attendee *selectedPerson in selectedPeople) {
if (self.context == nil) {
NSLog(@"NSManagedObjectContext is nil");
// return nil;
}
newAttendee = [NSEntityDescription insertNewObjectForEntityForName:@"Attendee" inManagedObjectContext:context];
[event addAttendeeObject:newAttendee];
newAttendee.createdOn = [NSDate date];
newAttendee.event = event;
newAttendee.person = selectedPerson;
NSLog(@"Person ID: %@", [selectedPerson.objectID description] );
if ([self uniqueEntityExistsWithEnityName:@"Attendee" UniqueKey:@"person" UniqueValue:[selectedPerson.objectID description] SortAttribute:@"createdOn" ManagedObjectContext:context]) {
NSLog(@"Attendee Exists!");
}
if (![context save:&error]) {
// Handle the error.
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
error = nil;
self.eventAttendee = nil;
[self.attendees insertObject:newAttendee atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
[FlurryAnalytics logEvent:@"Event Attendee Added"];
}
}
#pragma mark - Core Data - Manage Attendees
-(BOOL)uniqueEntityExistsWithEnityName:(NSString*)entityName UniqueKey:(NSString*) uniqueKey UniqueValue:(NSString*)uniqueValue SortAttribute:(NSString*)sortDescriptorAttribute ManagedObjectContext:(NSManagedObjectContext*) context1;
{
BOOL returnValue = NO;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
//what is the correct predates to compare the text an string core data property against a passed in string?
// request.predicate = [NSPredicate predicateWithFormat:@"unique= %@", uniqueValue];
request.predicate = [NSPredicate predicateWithFormat:@"%@=%@", uniqueKey, uniqueValue];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:sortDescriptorAttribute ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *matches = [context1 executeFetchRequest:request error:&error];
if (!matches)
{
NSLog(@"Error: no object matches");
}
else if([matches count] > 1) {
NSLog(@"Error: More than one object for unique record");
returnValue = YES;
} else if ([matches count] == 0) {
returnValue = NO;
} else {
returnValue = YES;
}
return returnValue;
}
助けてくれてありがとう!!!
ジェイソン