iOS 核心数据 - 获取结果
Posted
技术标签:
【中文标题】iOS 核心数据 - 获取结果【英文标题】:iOS Core Data - fetching results 【发布时间】:2011-02-22 08:35:39 【问题描述】:我的数据模型是多层的。让我举一个例子来演示数据模型。
我有三个实体说 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】:如果你得到你想要的排序顺序的反转,只需反转排序的accending;
参数。
如何指定订单 要插入的记录 实体对象?
你不能。排序被认为是接口的一个属性(因为相同的数据可能以许多不同的顺序出现),因此托管对象保存在无序集中,直到您使用排序描述符获取它们。
如果您想在数据中保存某种顺序,您必须使用属性或关系对顺序进行建模。但是,通常您希望保持订单“虚拟”,因为它只在 UI 中根据需要显示。
要获得更复杂的排序,请使用比较器块创建排序。请注意,这些可能会在内存和循环上产生意料之外的消耗,因此请谨慎使用。
您还可以为自定义 NSManagedObject 子类创建一个比较函数,该函数将按照您的意愿比较该类的任何两个对象。这通常是没有必要的。
【讨论】:
以上是关于iOS 核心数据 - 获取结果的主要内容,如果未能解决你的问题,请参考以下文章