NSPredicate извлекает объекты Core Data с атрибутом даты в диапазоне дат NSDate - PullRequest
1 голос
/ 12 марта 2011

Я использую NSPredicate с парой конструкций <= для извлечения объектов из основного хранилища данных с атрибутом startDate между двумя датами, но я получаю 0 выбранных объектов.

Вот мой NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"( ( %@ <= %K ) && ( %K <= %@ ) )", fromDate, @"startTime", @"startTime", toDate];

Вот вывод консоли:

predicate: CAST(336261600.000000, "NSDate") <= startTime AND startTime <= CAST(339285599.000000, "NSDate")
[sectionInfo numberOfObjects]: 0

Вот даты в Базовых данных (тип атрибута установлен в Date):

startTime
---------
337249800
337309200
337318200

fromDate и toDate являются NSDate объектами.Я попытался заменить их distantPast и distantFuture, чтобы полностью убедиться, что мои базовые данные startTime находятся в пределах диапазона дат, и я все еще получаю 0 выбранных объектов.

Понятия не имею, почему возвращается 0 объектов.Кто-нибудь может увидеть, где я иду не так?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Я бы начал с добавления следующего исполняемого аргумента:

-com.apple.CoreData.SQLDebug 1

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

Вы, очевидно, захотите удалить это перед отправкой приложения:)

0 голосов
/ 14 марта 2011

После просмотра сгенерированных SQL-запросов показалось, что TIMESTAMP оценивается как строка, а не как целое число.Это объясняет, почему мой предикат не работал.Я подтвердил это, выполнив следующий запрос SQL к базе данных SQLite, которую я использую для предварительного заполнения Core Data.

SELECT DISTINCT typeof(ZSTARTTIME) FROM ZMATCH;

Это показало, что поле TIMESTAMP было типа BLOB!

Добавление «+0» к моему предикату, чтобы атрибут startTime оценивался как целое число, устранило проблему.Однако это казалось неприятным решением.Кроме того, хранение дат в виде блобов, скорее всего, вызовет проблемы в будущем.Поэтому я вернулся и заново заполнил базу данных SQLite с нуля, убедившись, что TIMESTAMP были вставлены в виде целых чисел, а не строк.Теперь все работает нормально.

Однако это означает, что мне придется проделать дополнительную работу со следующим обновлением приложения, потому что я должен убедиться, что обновление перезаписывает старую базу данных SQLite вПапка документов с новым БД.Есть ли простой способ сделать это?Стоит ли смотреть на миграцию хранилища Core Data ??

...