2016-12-18 9 views
0

Я создаю сложный NSPredicate, который варьируется в зависимости от многих переменных. Метод, который лучше всего работает, состоит в том, чтобы построить каждое предложение отдельно как строку, объединить строки в массив, скрывать массив обратно в строку и прочитать его в предикат, используя предикатWithFormat. Он отлично работает за исключением одного случая, когда я сравниваю даты, и я получаю следующее сообщение об ошибке:Ошибка создания синтаксиса строкового предиката

Unable to parse the format string "(canceled != 1)&&(starttime >=2016-12-18 13:50:41 +0000)"'

Вот строка, где я строй этой статьи.

typePredClause = [NSString stringWithFormat:@"(starttime >=%@)",nowstr]; 

starttime в сущности NSDate и это, как я получаю nowstr

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
      [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
      NSString *nowstr = [dateFormatter stringFromDate:[NSDate date]]; 

Я знаю, что было бы идеально, чтобы просто использовать predicateWithFormat и оставить строки из него, но предикат так сложно, что строительство это единственное, что нужно.

Может кто-нибудь предложить, как исправить это?

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

if (typePredClause.length > 0) 
[predArr addObject:typePredClause]; 
NSString *predStr = [predArr componentsJoinedByString:@"&&"]; 
predicate = [NSPredicate predicateWithFormat:predStr]; 

ответ

0

Если starttime некоторые NSDate недвижимость, вы не должны создать строку из даты. Просто используйте NSDate.

И ваш подход к созданию вашего предиката - все неправильно. Не создавайте его, используя кучу строк. Сделайте это вот так:

NSPrediate *canceledClause = [NSPredicate predicateWithFormat:@"canceled != %d", someInt]; 
NSPredicate *startTimeClause = [NSPredicate predicateWithFormat:@"(starttime >= %@)", [NSDate date]]; 
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[ canceledClause, startTimeClause ]]; 
+0

Я отредактировал его без строк, используя сложный подход предиката и проблему. Благодаря! – Arjun