我想在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”的情况。
答案 0 :(得分:1)
大卫,
使用动态属性进行获取请求即使不是不可能也很困难。在Core Data中,通常会使用谓词来提取实体,然后使用谓词来精炼结果数组,例如使用-filteredArrayUsingPredicate:。虽然乍一看这看起来很浪费,但相对内存效率和速度都很快。
安德鲁
答案 1 :(得分:0)
使用NSPredicate
查看此链接http://cocoawithlove.com/2008/03/core-data-one-line-fetch.html
---修改
我无法告诉你如何以清晰和良好的代码执行此操作。但是您可以使用谓词创建两个数组 - 一个将is_archived数组设置为YES,另一个设置为NO,将排序描述符应用于两者并连接它们。我知道那很脏......