Основные данные: получить NSManagedObject по его свойствам - PullRequest
1 голос
/ 13 мая 2010

У меня есть объект NetworkMember, который не имеет атрибутов, но определяется его отношениями Person, Network, Level и Role. В моем приложении я нашел все четыре взаимосвязи, но я хочу убедиться, что дважды зарегистрировал мой NetworkMember, поэтому я хотел бы найти этот NSManagedObject перед его созданием.

Как мне написать запрос, который запрашивает NSManagedObject, состоящий только из отношений?

Приветствия

Nik

Ответы [ 2 ]

4 голосов
/ 20 мая 2010

Вы можете написать NSP-предикат для отношений так же, как для атрибутов.

Например:

- (BOOL)isPerson:(Person *)person memberOfNetwork:(Network *)network {
    // assume NetworkMember entity is ivar networkMemberEntity_
    // assume NSManagedObjectContext is ivar context_

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    [fetch setEntity:networkMemberEntity_];
    [fetch setPredicate:[NSPredicate predicateWithFormat:
        @"(person == %@) AND (networks CONTAINS %@)", person, network]];
    [fetch setFetchLimit:1];

    NSError *error = nil;
    NSInteger count = [context_ countForFetchRequest:fetch error:&error];
    if (count < 0) {
        // always handle errors in real code
        // and never check for errors using "error == nil"
    }

    return count > 0;
}

В случае, если вы представляете, однако, вы должны тщательно продумать, действительно ли вам нужно это сделать. Похоже, вы пытаетесь смоделировать отношения «многие ко многим» между человеком и сетью. Если вы пришли из базы данных, вы можете подумать, что для этого вам нужна таблица соединений и создать промежуточную сущность.

Однако Core Data может управлять всем этим для вас; вы можете создать отношения «многие ко многим» непосредственно между человеком и сетью, и вам не нужно будет поддерживать какой-либо промежуточный объект или таблицу самостоятельно. Так же, как вам не нужно беспокоиться о первичных и внешних ключах при работе со связями в Core Data, платформа работает с такими вещами для вас, позволяя вам работать на уровне объекта.

1 голос
/ 13 мая 2010

Вы можете использовать NSPredicate с путями ключ-значение для ссылки на отношения как предикат для NSFetchRequest. Например:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntity entityForName:@"NetworkMember" inManagedObjectContext:managedObjectContext];
[request setPredicate:[NSPredicate predicateWithFormat:@"person.name == %@ AND ANY (roles.name == \"Manager\")", name]];
NSInteger count = [managedObjectContext countForFetchRequest:request error:&error];
[request release];
if (error) { /* handle the error */ }
if (count != 0) { /* do something if the member already exists */ }

Если все, что вам нужно, это подтвердить существование определенного объекта, вы можете использовать метод countForRetchRequest:error:, чтобы увидеть, сколько объектов будет возвращено, если вы выполните запрос выборки. Если вы часто проводите этот тест, это может быть гораздо более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...