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 核心数据 - 获取结果的主要内容,如果未能解决你的问题,请参考以下文章

ios、swift、核心数据+多表

核心数据获取结果

获取结果崩溃(使用 persistentContainer) - 核心数据目标 C

iOS14.5 Widget 数据不是最新的

核心数据:如何进行第二次获取仅限于先前获取的结果?

获取请求中的一些奇怪结果 - 核心数据