我的数据模型是多层次的。让我举一个例子来演示数据模型。
我有三个实体说X,Y和Z.
X可以有1个或更多Y.
Y仅与1 X相关联。
Y可以有1个或更多个Z.
Z仅与1 Y相关联。
现在我的顶级tableview控制器 - 控制器A使用fetchedResults控制器从核心数据中获取所有X
当用户选择特定行时,他/她选择一个特定的X,我从中获得此X下所有Y的列表。传递给控制器B的特定Y.我还将托管的对象上下文从A传递给B.
在B中,我希望能够显示与Y相关的所有Z,但是按某种顺序。目前我发现该订单表明最近使用的Z.我希望它以相反的顺序。
如何指定(就核心数据而言)能够对此特定Y做出操作并根据特定标准获得结果?到目前为止,我所看到的核心数据的所有示例都是从头开始的,如下所示
NSManagedObjectContext *context = <#Get the context#>;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle the error
}
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
对此的一个解决方案是不使用NSFetchedRequest,而是对传递的Y对象进行操作并对NSArray进行排序。
NSAssert1(yObject!=nil,@"yObject is null",1);
NSSet *zObjects = yObject.zobjectsinY;
NSArray *zObjectArray = [zObjects allObjects] ;
sortedQZArray = [zObjectArray sortedArrayUsingFunction:intSort context:NULL];
我觉得这不是一个优雅的解决方案,应该有更好的方法来查询这些结果。
另一个选择是能够在创建数据时按预期顺序插入这些值吗?如何指定要插入实体对象的记录的顺序?
提前致谢
答案 0 :(得分:0)
如果您获得所需的排序顺序,只需反转排序的accending;
参数即可。
如何指定a的顺序 要插入的记录 实体对象?
你做不到。排序被视为接口的属性(因为相同的数据可能出现在许多不同的顺序中),因此托管对象保存在无序集中,直到您使用排序描述符获取它们。
如果要在数据中保存某种订单,则必须使用属性或关系对订单建模。但是,通常,您希望保持订单“虚拟”,因为它只在UI中显示。
要获得更复杂的排序,请使用比较器块创建排序。请注意,这些可能会对内存和周期产生意外的影响,因此请谨慎使用。
您还可以为自定义NSManagedObject子类创建比较函数,该子类将以您希望的方式比较类的任何两个对象。这通常是没有必要的。