Основные данные: выборка из категории (расширение основного класса)

EDIT: Во-первых, я полагаю, что мне не следует создавать метод экземпляра такого типа, а делать его методом класса!? Другое дело, я добавил в класс C метод fetch, который работает. Я просто думаю, что было бы удобно, если бы можно было получить доступ к хранилищу данных через управляемые объекты, но я полагаю, что это несколько противоречит идеям, лежащим в основе managedObjectContext, постоянства и так далее?


Я не уверен, что я пытаюсь сделать что-то, что вы не должны делать, но вот.

У меня есть модель данных с объектом A, имеющим отношение к объекту B (B ко многим A). У меня есть ряд сущностей типа B в хранилище данных, и теперь я хотел бы создать ряд сущностей типа A. Для этого мне нужно получить ссылки на сущности типа B, т.е. для запроса хранилища данных. Я делаю следующее в категории B, т.е.:

#import "B+Helper.h"

@dynamic managedObjectContext;

@implementation B (Helper)

- (Store *)getBByRef:(NSString *)ref
{
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"B" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"ref == %@", ref];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *storeArray = [self.managedObjectContext executeFetchRequest:request error:&error];
    NSInteger bCount = [bArray count];
    if ( bCount > 1 || bCount == 0) {
        // Deal with error...
    } else {
        return [bArray objectAtIndex:0];
    }
}

Теперь проблема в том, что я не могу правильно установить manageObjectContext --- я получаю сообщение об ошибке:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'B'

Я попытался передать managedObjectContext из AppDelegate в класс C, чтобы получить объекты B, и из класса C в класс B + Helper перед вызовом метода, указанного выше, но это не сработало.

По сути, я просто хочу иметь возможность сделать запрос основной даты из простого класса NSObject или расширения NSManagedObject, то есть из класса, который не является каким-либо UIViewController.

В классе C я сделал следующее:

B *b = [[B alloc] init];
b.managedObjectContext = self.managedObjectContext;

Но затем я получаю сообщение об отсутствии селектора:

setManagedObjectContext:]: unrecognized selector sent to instance...

Я надеюсь, это имеет смысл?!


person marrop    schedule 12.04.2012    source источник


Ответы (1)


Действительно, вместо того, чтобы создавать категорию с методом экземпляра, вы должны просто добавить свой уже написанный метод в сгенерированную реализацию и интерфейс класса сущностей B.

+ (Store *)getBByRef:(NSString *)ref;

И он должен работать нормально.

person Nikita Pestrov    schedule 12.04.2012
comment
Категории на самом деле очень хорошо использовать с Core Data, потому что, если вам придется регенерировать файлы классов, ваши методы не будут уничтожены. Ваша идея хороша, просто я бы поместил этот метод класса в категорию. - person sosborn; 13.04.2012
comment
Верно, с точки зрения регенерации, категории — это здорово. - person Nikita Pestrov; 13.04.2012