Базовые данные NSFetchedResultsController: ошибка при отладке на устройстве (невозможно создать SQL для предиката) - PullRequest
1 голос
/ 28 июня 2011

У меня странное исключение, когда я отлаживаю свое приложение на моем устройстве. отладка в симуляторе работает как положено.

  • я использую основные данные для хранения своих данных
  • отношения в модели следующие: Location <-> LocationDetails - >> HappyHour
  • я использую NSFetchedResultsController для заполнения UITableView
  • Я также довольно новичок в развитии цели c

мне нужно иметь SUBQUERY, чтобы добраться до атрибутов сущности HappyHour.

Как это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(details.%K, $hh, ($hh.startTime < %@) AND ($hh.endTime > %@)).@count)", weekdayString, theDate, theDate];

ТОЛЬКО на УСТРОЙСТВЕ я получаю эту ошибку / исключение:

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно сгенерировать SQL для предиката (0! = SUBQUERY (details.hh_montag, $ hh, $ hh.startTime CAST (316482000.000000, "NSDate")). @ Count) (проблема с RHS) '

0 CoreFoundation 0x32cf964f __exceptionPreprocess + 114
1 libobjc.A.dylib 0x3313cc5d objc_exception_throw + 24
2 CoreData 0x3228a829 - [NSSQLGenerator newSQLStatementForFetchRequest: ignoreInheritance: countOnly: nestingLevel:] + 688
3 CoreData 0x3228a2eb - [NSSQLAdapter _newSelectStatementWithFetchRequest: ignoreInheritance:] + 378
4 CoreData 0x3228a169 - [NSSQLAdapter newSelectStatementWithFetchRequest:] + 16
5 CoreData 0x3228a005 - [NSSQLCore newRowsForFetchPlan:] + 288
6 CoreData 0x322892c5 - [NSSQLCore objectsForFetchRequest: inContext:] + 420
7 CoreData 0x32288875 - [NSSQLCore executeRequest: withContext: error:] + 304
8 CoreData 0x32287dd5 - [NSPersistentStoreCoordinator executeRequest: withContext: error:] + 896
9 CoreData 0x3228669f - [NSManagedObjectContext executeFetchRequest: ошибка:] + 374
10 CoreData 0x322b9d7f - [NSFetchedResultsController executeFetch:] + 766
11 HappyHourRadar 0x0003e723 - [ResultViewController viewDidLoad] + 86
...
прекращение вызова после выброса экземпляра 'NSException' Полученный сигнал: SIGABRT (Прервано)

Процесс завершен с кодом выхода -1


В [ResultViewController viewDidLoad] + 86

я звоню

[self fetchedResultsController] executeFetch: & error]


в консоли я также получаю это сообщение:

невозможно загрузить файл символов: невозможно загрузить файл символов: предупреждение: невозможно прочитать символы для /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.3 (8J2) / Symbols / Developer / usr / lib / libXcodeDebuggerSupport. dylib (файл не найден).


Поскольку я не нашел ничего, что могло бы мне помочь, я думаю, это либо что-то действительно странное, либо я просто испортил что-то довольно стандартное, что я не могу найти из-за моей ограниченной цели c фоном ...

В любом случае, я был бы очень рад, если бы кто-то мог дать подсказку, поэтому я могу продолжить без необходимости переписывать весь мой уровень модели приложения во что-то грязное (например, выборка всех записей и удержание их в массиве и функции фильтра процесса ..) .пакет такой;))


редактирование:

вот график модели. из этого автоматически сгенерированные файлы модели.

Ссылка на изображение

сгенерированный класс HappyHour:

@interface HappyHour :  NSManagedObject  
{
}

@property (nonatomic, retain) NSDate * endTime;
@property (nonatomic, retain) NSDate * startTime;

@end

1 Ответ

1 голос
/ 28 июня 2011

Я понял это. Надеюсь, это поможет кому-то, кто такой же слепой, усталый или кто-то еще, как я ;)

Эти отрывки, выделенные жирным шрифтом, явно не соответствуют:

  • Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно сгенерировать SQL для предиката (0! = SUBQUERY (подробности. hh_montag , $ hh, $ hh.startTime CAST (316482000.000000, "NSDate")). @ Count) (проблема с RHS) '

и

@ Местоположение класса;

@ интерфейс LocationDetails: NSManagedObject {}

@ свойство (неатомное, сохранение) NSString * phone;

...

@ свойство (неатомное, сохранение) NSSet * hh_monday ;

...

@ конец

Окончательное решение было:

NSTimeInterval secondsPerDay = 7 * 60 * 60;
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"EEEE"];

SOLUTION >> [f setLocale: [[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"] autorelease]];

NSString *weekdayString = [NSString stringWithFormat:@"hh_%@", [[f stringFromDate:[NSDate dateWithTimeIntervalSinceNow:-secondsPerDay]] lowercaseString]];

Золотое правило:

Всегда имейте в виду, что устройство будет работать по-разному в другом месте / языке.

Итак, возможно, следует избегать создания ключевых селекторов (?) Из классов, зависящих от местоположения / языка, таких как NSDate (Formatter).
Или убедитесь, что эти классы возвращают одинаковые значения для каждого случая. (Надеюсь, что-то, о чем я позаботился с этим решением ... поправьте меня, если я ошибся.)

...