«Неподдерживаемое выражение функции CAST ...» при использовании NSPredicate с типом хранилища данных SQLite Core - PullRequest
2 голосов
/ 29 декабря 2011

Я пытаюсь запросить выборку со следующим кодом:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dateModified > CAST(CAST(now(), \"NSNumber\") - %d, \"NSDate\")", (30*86400)];
NSFetchRequest *itemRequest = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
[itemRequest setPredicate:predicate];

NSArray *items = [[self managedObjectContext] executeFetchRequest:itemRequest error:nil];

..., чтобы выбрать элементы, где 'dateModified> | now () - 30 days |'.Проблема в том, что вышеупомянутый предикат работает правильно (выбирается правильно), пока я не сохраню свой NSPersistentDocument в качестве SQLite и повторно открою документ.При повторном открытии документа я получаю следующую ошибку:

Неподдерживаемое выражение функции CAST (CAST (now (), "NSNumber") - 2592000, "NSDate")

Почему этот предикат работает правильно вплоть до сохранения или если я сохраняю документ в формате XML, но не работает правильно, если я сохраняю как SQLite?Есть ли способ использовать этот предикат с типом хранилища SQlite?

PS Я также пытался сформировать предикат со следующим кодом, но получаю ту же ошибку:

//"now()" is a function and takes no arguments
NSExpression * now = [NSExpression expressionForFunction:@"now" arguments:[NSArray array]];

//CAST(now(), 'NSNumber')
NSArray * castNowArguments = [NSArray arrayWithObjects:now, [NSExpression expressionForConstantValue:@"NSNumber"], nil];
NSExpression * castNow = [NSExpression expressionForFunction:@"castObject:toType:" arguments:castNowArguments];

//CAST(now(), 'NSNumber') [+/-] {a time interval}
NSArray * relativeTimestampArguments = [NSArray arrayWithObjects:castNow, [NSExpression expressionForConstantValue:[NSNumber numberWithDouble:(30*86400)]], nil];
NSExpression * relativeTimestamp = [NSExpression expressionForFunction:@"from:subtract:" arguments:relativeTimestampArguments];

//CAST(CAST(now(), 'NSNumber') [+/-] {a time interval}, 'NSDate')
NSArray * castToDateArguments = [NSArray arrayWithObjects:relativeTimestamp, [NSExpression expressionForConstantValue:@"NSDate"], nil];
NSExpression * castToDate = [NSExpression expressionForFunction:@"castObject:toType:" arguments:castToDateArguments];

NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"dateModified"] 
                                                            rightExpression:castToDate 
                                                                   modifier:NSDirectPredicateModifier
                                                                       type:NSGreaterThanOrEqualToComparison 
                                                                    options:0];

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я нашел свое собственное решение ...

Вызовы функций не поддерживаются при извлечении данных из типа хранилища SQLite.Можно использовать только вызовы функций в выборках для данных в памяти.Чтобы по-прежнему использовать этот предикат, мне сначала нужно было получить набор данных, а затем отфильтровать массив, используя:

[allItems filteredArrayUsingPredicate:predicate];

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 21 апреля 2017

Следующий код сработал очень хорошо в моем случае:

now() - 2592000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...