Базовая схема доступа к данным данных? - PullRequest
4 голосов
/ 10 августа 2011

Мне кажется сумасшедшим, что у меня есть все эти NSFetchRequests для одного и того же NSManagedObjects, распределенные по различным контроллерам представления в моем приложении, есть ли хороший шаблон для доступа к данным, который помещает то, что мне нужно в одном месте?

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

Я согласен, что это немного, к счастью, есть Active Record для Core Data.Это делает выборку менее утомительной, например, выборка всех объектов Person из базовых данных будет такой же простой, как

NSArray *people = [Person findAll];
1 голос
/ 10 августа 2011

Да, есть, это называется рисунок фасада . Просто определите открытый метод в вашем подклассе NSManagedObject следующим образом:

@interface Group : NSManagedObject { }
// … cruft here …
-(NSArray*)peopleSortedByName;
@end

И скрыть неприятную реализацию следующим образом:

-(NSArray*)peopleSortedByName;
{
    NSFetchRequest* request = // … bla bla, lots of code here
    return [[self managedObjectContext] executeFetchRequest:request
                                                      error:NULL];
}

Затем используйте метод так же, как если бы он был любым другим классом в вашем коде. Напиши один раз, облегчение везде.

0 голосов
/ 11 августа 2011

Определение метода категории для контекста NSManagedObject, который оборачивает общий запрос в однострочник.

@interface NSManagedObjectContext(MyQueryAdditions)

-(NSArray *)queryEntityForName:(NSString *)name predicateFormat:(NSString *)pstring argumentArray:(NSArray *)arr;

@end


@implementation NSManagedObjectContext(MyQueryAdditions)

-(NSArray *)queryEntityForName:(NSString *)name predicateFormat:(NSString *)pstring argumentArray:(NSArray *)arr
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:self];
    NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];

    [fetch setEntity:entity];
    NSPredicate *pred;

    if(pstring)
    {
        if(arr) pred = [NSPredicate predicateWithFormat:pstring argumentArray:arr];
        else    pred = [NSPredicate predicateWithFormat:pstring];
        [fetch setPredicate:pred];
    }

    NSError *error = nil;
    [self retain];
    [self lock];
    NSArray *results = [self executeFetchRequest:fetch error:&error];

    if (error) {
        NSLog(@"MOC Fetch - Unresolved error %@, %@", error, [error userInfo]);
        results =  [NSArray array];
    }

    [self unlock];
    [self release];

    return results;

}

@end

Означает, что базовый запрос ко всем элементам может быть простым, например

NSArray *cres = [managedObjectContext queryEntityForName:@"Person" predicateFormat:nil argumentArray:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...