Базовые данные - Fetch не дает тот же результат - PullRequest
0 голосов
/ 01 сентября 2011

Итак, я добавляю ListItem в ListName (установлено отношение один ко многим) в классе A

relationship

ListItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"ListItem"
inManagedObjectContext:self.context];
//setting some attributes...

[listName addListItemsObject:newItem];
[self.context save:&error];    

После этого Класс B использует метод делегата с именем

Там я хочу получить данные из Core Data, НО ... Если я выбираю все ListName, элементы ListItems устарели (например, только 5 элементов вместо 6). Если я получу все ListItems, то там все есть (6 из 6).

Что не так с моим кодом ... Мне нужно получить все ListNames, хотя

NSError *error;
NSFetchRequest *req = [[NSFetchRequest alloc] init];
if(context == nil)
   NSLog(@"context is nil");

NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListName" inManagedObjectContext:self.context];
[req setEntity:descr];

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

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

NSArray * results = [self.context executeFetchRequest:req error:&error];

self.listNames = [results mutableCopy];
if ([results count] > 0) {
    ListName *test = [results objectAtIndex:0];
    [test.listItems count];
    NSLog(@"item count on list %i", [test.listItems count]);
    //wrong result

    NSFetchRequest *newReq = [[NSFetchRequest alloc] init];
    NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context];
    [newReq setEntity:descr];

    NSArray * results2 = [self.context executeFetchRequest:newReq error:&error];
    NSLog(@"item count on items %i", [results2 count]);
    //right result

}

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Простой сброс помог

0 голосов
/ 02 сентября 2011

Учитывая вашу модель данных и код, нет никаких причин, чтобы количество элементов ListItems в обоих местах было одинаковым, поскольку значения двух разных наборов объектов не обязательно перекрываются.

Первый счет задается этим кодом:

ListName *test = [results objectAtIndex:0];
[test.listItems count];

… который возвращает количество ListItems объектов в отношении одного, конкретного и уникального ListName объекта. У вас может быть один ListName объект или сотни, каждый из которых может иметь произвольное количество связанных ListItems объектов. Этот код будет считать только те, которые связаны с первым ListName возвращенным объектом.

Второй счет определяется как:

NSFetchRequest *newReq = [[NSFetchRequest alloc] init];
NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context];
[newReq setEntity:descr];

NSArray * results2 = [self.context executeFetchRequest:newReq error:&error];
NSLog(@"item count on items %i", [results2 count]);

… который возвращает нефильтрованный массив, содержащий каждый экземпляр ListItems в постоянном хранилище, независимо от того, какие у них отношения.

Нет особой причины ожидать, что первый счетчик когда-либо совпадет со вторым, потому что он будет делать это только тогда, когда (1) у вас есть один объект ListNames в магазине и (2) каждый существующий объект ListItems находится в этих ListNames.listNames отношениях.

Убедитесь, что не путаете сущности и управляемые объекты.

Кстати, вы почти всегда должны использовать взаимные отношения, например, если у вас есть ListNames.listItems, вы должны иметь обратную ListItems.listName.

...