Я пытаюсь запросить выборку со следующим кодом:
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];