核心数据,动态属性还是CASE排序?

时间:2011-09-20 18:02:24

标签: sql objective-c core-data

我想在Core Data模型上实现动态属性,但不清楚这是否受支持,如果是这样......怎么样?

我们的想法是拥有一组具有一定数量的非动态字段的模型,例如created_at,updated_at,start_at,end_at等。这些将是日期。然后,我想要包含一个名为“is_archive”的动态属性,该属性将对“end_at”属性执行基本检查并返回True或False。

我知道我可以更新模型以添加自定义属性,但我不知道如何实现它,以便我可以在NSSortDescriptor中包含“is_archive”。

现在,我有:

NSFetchRequest *request = [[NSFetchRequest init] alloc];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"event" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

NSSortDescriptor *sort1 = [[NSSortDescriptor alloc] initWithKey:@"start_at" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObjects:sort1,nil]];

我想做的是添加:

NSSortDescriptor *sort2 = [[NSSortDescriptor alloc] initWithKey:@"is_archive" ascending:NO];

在SQL中,我通常会使用CASE语句执行此操作,例如:

select *
from event e
order by case when e.end_at > curdate() then 1 else 0 end desc, e.end_at asc;

所以我想问题是:

如何使用Core Data NSSortDescriptor或等效文件执行“使用x> y THEN true ELSE false END”的情况。

2 个答案:

答案 0 :(得分:1)

大卫,

使用动态属性进行获取请求即使不是不可能也很困难。在Core Data中,通常会使用谓词来提取实体,然后使用谓词来精炼结果数组,例如使用-filteredArrayUsingPredicate:。虽然乍一看这看起来很浪费,但相对内存效率和速度都很快。

安德鲁

答案 1 :(得分:0)

使用NSPredicate

查看此链接http://cocoawithlove.com/2008/03/core-data-one-line-fetch.html

---修改

我无法告诉你如何以清晰和良好的代码执行此操作。但是您可以使用谓词创建两个数组 - 一个将is_archived数组设置为YES,另一个设置为NO,将排序描述符应用于两者并连接它们。我知道那很脏......