2015-02-10 7 views
0

Это приложение, которое я создавал, запускается на iPad, и я тестировал его на iOS8.1 с помощью XCode 6.1.1. У меня возникла проблема, когда я пытаюсь извлечь записи, сравнивая дату записи в миллисекундах. Записи хранятся с использованием CoreData.iOS Predicate for CoreData с длинными длинными значениями не был достаточно точным

firstDate рекорда объявляется следующим

record.firstDate = [NSNumber numberWithLongLong:1423288915464]; 

firstDate объявлен в .h файле записи таким образом:

@property (nonatomic, retain) NSNumber * firstDate; 

предикат объявлен следующим образом:

NSNumber* prevStartMillis = [NSNumber numberWithLongLong:1423324800000]; 
NSNumber* prevEndMillis = [NSNumber numberWithLongLong:1423411199000];  

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"firstDate >= %lld AND firstDate < %lld", [prevStartMillis longLongValue], prevEndMillis longLongValue]]; 

Я получил некоторые записи с firstDate, которые входят в спецификацию . Тем не менее, я получаю несколько записей, которые не попадают в указанный диапазон, как эти 3 из многих:

... 
FirstDate:1423288915464 
FirstDate:1423282909663 
FirstDate:1423286413320 
... 

Раньше у меня была аналогичная проблема, на другое приложение для iPhone 6 iOS8.1 с помощью XCode 6.1.1, как Что ж. Я смог решить это, объявив предикаты с% lld для длинных значений. Однако, когда я использую тот же код, он не работает на iPad. Кто-нибудь знает, что я сделал неправильно? Заранее спасибо!

EDIT 1: Обход
У меня есть обходной путь (хотя и не очень эффективно). Вот фрагмент кода, после того, как я извлечь записи, если кто-то интересно:

NSMutableArray* validRecords = [[NSMutableArray alloc] init]; 

for(Record* record in results) { 
    if([record.firstDate longLongValue] >= [prevStartMillis longLongValue] && [record.firstDate longLongValue] <= [prevEndMillis longLongValue]) 
     [validRecords addObject:record]; 
} 

ответ

1

Вы не должны извлечь из longNSNumber, как вы делаете. Вы можете использовать NSNumber объекты явно создать предикат

NSNumber* prevStartMillis = [NSNumber numberWithLongLong:1423324800000]; 
NSNumber* prevEndMillis = [NSNumber numberWithLongLong:1423411199000];  

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"firstDate >= %@ AND firstDate < %@", prevStartMillis, prevEndMillis]; 

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

NSNumber* prevStartMillis = /*14233e+8*/; 
NSNumber* prevEndMillis = /*14234e+8*/; 

и это числа из диапазона:

... 
FirstDate:14232e+8 
FirstDate:14232e+8 
FirstDate:14232e+8 
... 

Так что теперь это легко заметить, что эти цифры являются «немного» меньше, чтобы удовлетворить вас состояние

+0

Спасибо, он работает, но он все еще не решает проблему, которую я испытываю. – javaNoob

+0

Я отредактировал свой ответ, еще раз проверьте его –

+0

Привет, я проверял, как это работает для моего дела! Однако это не работает, если указанный предикат работает до миллисекунд, например. между 1423324800004 и 1423324800006. Независимо от того, я не думаю, что буду проверять записи до такой точности, поэтому я собираюсь отметить ваш как правильный ответ! – javaNoob

0

Похоже, его подписью и без знака вопроса стоимости. Вы можете использовать% llu и проверить, работает ли он.

+0

Привет, я пробовал, и все равно. Я сдался и использовал оператор if – javaNoob

0

Решение было иметь если заявление, чтобы проверить даты после того, как я получить записи (см Edit 1 в вопросе)

 Смежные вопросы

  • Нет связанных вопросов^_^