在CoreData中选择带有NSExpression的列

时间:2015-02-16 21:53:46

标签: ios objective-c cocoa-touch core-data

我有一个包含两列的对象:updatedAtServer& updatedAtLocal。

当updatedAtServer存在时,应该使用它,否则回退到updatedAtLocal。

我想进行查询以找到此回退逻辑的最大时间戳,但无法弄清楚如何。

在SQL中,我猜你可以在MAX函数中使用CASE函数:

MAX(CASE WHEN updatedAtServer IS NOT NULL THEN updatedAtServer ELSE updatedAtLocal END)

如何使用CoreData解决此问题?

1 个答案:

答案 0 :(得分:0)

一个可能不是纯粹但实际的解决方案是做两个查询。这不应该影响性能,因为子查询等往往会导致多次去商店。

使用内存中谓词进行演示

NSArray *noServerUpdated = [allItems filteredArrayUsingPredicates:
  [NSPredicate predicateWithFormat:@"updatedAtServer = NULL"];
NSArray *serverOrLocal = [allItems filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"not IN %@", noServerUpdated];
NSArray *serverUpdated = [serverOrLocal filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"updatedAtServer >= updatedAtLocal"];
NSArray *localUpdated = [[serverOrLocal filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"not IN %@", serverUpdated]
    arrayByAddingObjectsFromArray:noServerUpdated];


NSNumber *maxServer = [serverUpdated valueForKeyPath:@"@max.updatedAtServer"];
NSNumber *maxLocal = [localUpdated valueForKeyPath:@"@max.updatedAtLocal"];
NSNumber *max = [maxUpated compare:maxLocal] == NSOrderAscending ?
  maxLocal : maxUpated;

也许首先检查空结果。