0

コア データ エンティティが一意であるかどうかを判断することについて多くの議論があったことは知っていますが、人々が投げ出したさまざまな解決策を理解するのに苦労しています。うまくいけば、誰かが私に簡単な解決策を提供してくれます。

状況:

基本的に多対多の関係 (イベント -> 出席者 <- 人) であるエンティティがあります。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;
}

助けてくれてありがとう!!!

ジェイソン

4

1 に答える 1

0

EDIT コメントの後。

OK、あなたの問題は人をイベントに追加していません。あなたの問題は、出席者が特定の関係を持つイベントに出席者を追加することです。

その場合、最初に次のような単純なフェッチを行います...

// Find all Attendee objects that are linked to both our event and person
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Attendee"];
request.predicate = [NSPredicate predicateWithFormat:@"(event.name = %@) AND (person.name = %@)", eventName, personName];

次に、フェッチを実行できます。探しているイベントと指定された人の両方を含むすべての参加者オブジェクトが返されます。何も返されない場合、その人は出席者として追加されていません。

多数のオブジェクトがある場合は、より高速な他の方法があります (インデックスを持つ属性やその他の要因によって異なります)。結合 (つまり、述語内の関係) の使用は、それほど高速ではなく、インデックス属性を指定しない限り、すべての検索は直線的です。

于 2012-04-29T20:23:31.403 に答える