我有一个包含两列的对象:updatedAtServer& updatedAtLocal。
当updatedAtServer存在时,应该使用它,否则回退到updatedAtLocal。
我想进行查询以找到此回退逻辑的最大时间戳,但无法弄清楚如何。
在SQL中,我猜你可以在MAX函数中使用CASE函数:
MAX(CASE WHEN updatedAtServer IS NOT NULL THEN updatedAtServer ELSE updatedAtLocal END)
如何使用CoreData解决此问题?
答案 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;
也许首先检查空结果。