iOS核心数据 - 获取结果

时间:2011-02-22 08:35:40

标签: ios core-data

我的数据模型是多层次的。让我举一个例子来演示数据模型。

我有三个实体说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];

我觉得这不是一个优雅的解决方案,应该有更好的方法来查询这些结果。

另一个选择是能够在创建数据时按预期顺序插入这些值吗?如何指定要插入实体对象的记录的顺序?

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您获得所需的排序顺序,只需反转排序的accending;参数即可。

  

如何指定a的顺序   要插入的记录   实体对象?

你做不到。排序被视为接口的属性(因为相同的数据可能出现在许多不同的顺序中),因此托管对象保存在无序集中,直到您使用排序描述符获取它们。

如果要在数据中保存某种订单,则必须使用属性或关系对订单建模。但是,通常,您希望保持订单“虚拟”,因为它只在UI中显示。

要获得更复杂的排序,请使用比较器块创建排序。请注意,这些可能会对内存和周期产生意外的影响,因此请谨慎使用。

您还可以为自定义NSManagedObject子类创建比较函数,该子类将以您希望的方式比较类的任何两个对象。这通常是没有必要的。