Путаница с NSFetchedResultsController - PullRequest
0 голосов
/ 05 августа 2011

Привет, у меня есть развивающаяся базовая модель данных, как указано ниже:

lookup -> detail -> itemDetail

lookup находится на верхнем уровне, и для каждого 1 объекта может быть много деталейи для каждой сущности в деталях может быть 1 в itemDetail.

До реализации itemDetail в моем "движке" основных данных у меня есть следующий метод:

`- (NSFetchedResultsController *){

// if controller already created and the caller does not need a new one...

if (fetchedResultsController != nil && !needsNewFetchedResultsController) {

    return fetchedResultsController;
}


// we must flush the class cache first

[NSFetchedResultsController deleteCacheWithName:@"searches"];


// then set to nil to remove existing data

self.fetchedResultsController = nil;


// resetflag back to NO for future calls into this method

self.needsNewFetchedResultsController = NO;


// all the search results are in the "SearchDetail" table and categorised by the resource type

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"resource_type == %@ AND lookup.search_phrase == %@", self.resource, self.searchText];


// create the fetch request and set the predicate

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

fetchRequest.predicate = predicate;


// hook up to the required table  

NSEntityDescription *entity = [NSEntityDescription entityForName:@"SearchDetail" inManagedObjectContext:self.context];

[fetchRequest setEntity:entity];


// NSFetchedRequestController wants a sort, but we dont so just use type field to placate it ;-)

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"resource_type" ascending:NO];

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                                 managedObjectContext:self.context 
                                                                                                   sectionNameKeyPath:nil 
                                                                                                            cacheName:@"searches"];

self.fetchedResultsController = theFetchedResultsController;


self.fetchedResultsController.delegate = self;

[theFetchedResultsController release];

[sort release];

[fetchRequest release];

return self.fetchedResultsController;    

} `

Это позволяет мне извлекать данные из деталей для поиска, выполняемого при поиске, и все работает хорошо.

Но теперь, когда я включил itemDetailТеперь мне нужно получить данные из itemDetail, когда выбрана подробная запись ...... но NSFetchedResulstController в моем ядре данных настроен, как указано выше, для другого запроса?

Нужно ли иметь несколькометоды для различных NSFetchedResultsController или мне нужно выполнить какую-либо форму проверки флагов в существующей?

По мере роста моей модели я вижу, как это перерастает в abк востоку от проблемы, поэтому нужно предпринять это скорее раньше, чем слишком поздно!

В надежде ....

1 Ответ

1 голос
/ 05 августа 2011

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

lookup содержит отношение «ко-многим» к деталям, назовите его деталями; деталь содержит отношение «один к одному» с itemDetail, назовите его itemDetail;

Теперь, когда вы выбираете объект поиска, вам не требуется никаких дополнительных запросов (и, следовательно, никакого дополнительного NSFetchedResultsController) для извлечения объектов сведений и из объекта сведений его соответствующего itemDetail.

Вы можете просто сделать это:

NSSet *details = yourSelectedLookupObject.details;

// now browse the detail objects
for(Detail *detailObject in details){
    // get the associated itemDetail
    ItemDetail *itemDetail = detailObject.itemDetail;

    // process itemDetail as needed ...

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