CoreData: правильно ли работает findAllWithPredicate?

Я использую библиотеку Magical Record. Это круто, но у меня есть некоторые проблемы. Мой второй метод возвращает неверные данные. Первый и второй методы должны возвращать одинаковое количество кавычек. Правильно ли работает findAllWithPredicate?

РАЗБЛОКИРОВАТЬ И ПОЛУЧАТЬ ЦЕНЫ

-(NSArray*) unlockAndFetchQuotes
{
 CoreDataManager *instance = [CoreDataManager instance];
 [instance unlockUnitNumber:1];
 return [instance fetchQuotes];
}

РАЗБЛОКИРОВАТЬ НОМЕР БЛОКА

-(void) unlockUnitNumber:(int) number
{
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"identificator=%d", number];
 NSArray *array =[CDInApp findAllWithPredicate:predicate];
 if (array.count>0)
 {
    CDInApp *inApp = [array objectAtIndex:0];
    inApp.isLockedValue = NO;
    [[NSManagedObjectContext defaultContext] saveNestedContexts];
 }
}

ПОЛУЧИТЬ ЦИТАТЫ

-(NSArray*) fetchQuotes
{
 int z=0;
 NSArray *arr = [CDQuotes findAll];
 for (CDQuotes * quotes in arr)
 {
    if (!quotes.inApp.isLockedValue)
    {
        z++;
    }
 }
   NSLog(@"_____ unlocked quotes by first method %d", z);


 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"inApp.isLocked != 1"];
 int count = [CDQuotes countOfEntitiesWithPredicate:predicate];
   NSLog(@"_____ unlocked quotes by second method %d", count);

 NSArray *array = [CDQuotes findAllWithPredicate:predicate];
   NSLog(@"total unlocked array %d", array.count);

 return array;
}

Первый и второй методы должны возвращать одинаковое количество кавычек. Второй способ не работает должным образом.

Мои результаты

___ must be unlocked quotes 500
___ unlocked quotes by first method 500
___ unlocked quotes by second method 250
total unlocked array 250

введите здесь описание изображения

ОБНОВЛЕНИЕ 2

Я нашел проблему. Во-первых, я делаю unlockAndFetchQuotes. Я отслеживаю эту функцию и обнаружил нечто странное. Сохранение в coredata происходит после получения котировок. Теперь я ищу решения для мгновенного сохранения.

2012-12-21 18:13:32.992 CoreBug[6713:11603] _____ unlocked quotes by first method 8
2012-12-21 18:13:32.994 CoreBug[6713:11603] _____ unlocked quotes by second method 6
2012-12-21 18:13:32.996 CoreBug[6713:11603] -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x7464700) -> Saving <NSManagedObjectContext (0x7464700): *** DEFAULT ***> on *** MAIN THREAD ***
2012-12-21 18:13:32.997 CoreBug[6713:15603] -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x8148ef0) -> Saving <NSManagedObjectContext (0x8148ef0): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD ***

Я разблокировал свое устройство и получил котировки.


person Voloda2    schedule 20.12.2012    source источник
comment
Идентификатор или на какую сущность вы пытаетесь ссылаться в своем предикате?   -  person Mundi    schedule 20.12.2012
comment
У меня 1000 котировок и 4 блока inApp. Один объект inApp отвечает за 250 котировок. Я могу легко заблокировать/разблокировать свои котировки. Я не совсем понимаю ваш вопрос.   -  person Voloda2    schedule 20.12.2012
comment
У вас есть predicateWithFormat:@"identificator=%d". Какая сущность?   -  person Mundi    schedule 20.12.2012


Ответы (3)


Вы используете isLockedValue в своем цикле вместо isLocked. Предположительно, isLockedValue не существует и всегда будет nil, что приведет к подсчету всех элементов в цикле.

Напротив, ваш предикат работает правильно.

person Mundi    schedule 20.12.2012
comment
Когда создаются классы CoreData, isLockedValue разрешает доступ для чтения/записи как BOOL, где isLocked — это NSNumber. Также доступ к несуществующему свойству, скорее всего, приведет к сбою. - person Joe; 20.12.2012
comment
Итак, вы попробовали вместо этого ìsLocked и получили ожидаемые результаты? - person Mundi; 21.12.2012
comment
Таким образом, вы должны NSLog получить результат выборки и посмотреть, какие значения у вас есть в ваших данных. В качестве альтернативы используйте инструмент командной строки sqlite3. - person Mundi; 21.12.2012
comment
Пожалуйста, смотрите мое обновление2. Сохранение в coredata происходит после получения котировок. Теперь я ищу решения для мгновенного сохранения. - person Voloda2; 21.12.2012

Вы пытались изменить свой предикат на

[NSPredicate predicateWithFormat:@"inApp.isLocked = NO"]

?

person casademora    schedule 20.12.2012
comment
Результат тот же. Пожалуйста, смотрите мой раздел обновлений, где я нашел что-то странное. - person Voloda2; 21.12.2012

saveNestedContexts — это асинхронный метод. Мне нужно использовать другой метод

[localContext MR_saveNestedContextsErrorHandler:nil completion:^{
        [self fetchQuotes];
    }];
person Voloda2    schedule 22.12.2012