CoreData:按创建的顺序获取和排序结果,不使用时间戳

Posted

技术标签:

【中文标题】CoreData:按创建的顺序获取和排序结果,不使用时间戳【英文标题】:CoreData: Fetch and sort results in the order they were created, without using a timestamp 【发布时间】:2014-02-24 18:33:19 【问题描述】:

这是一个非常简单的问题。

我有一个使用本地文件初始化的 CoreData 数据库。 如下所示的 CoreData 架构:

Category -->> Objections -->> Responses -->> Evidence

("-->>" 表示,有很多)

我正在使用 NSFetchedResultsController 从核心数据中检索对象。很标准。

NSEntityDescription *entity = [NSEntityDescription entityForName:NSStringFromClass([OHObjection class])inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"[suitable key]" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];

[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"category.objectionCategoryText" cacheName:nil];

每个“对多”关系都是有序的。

问题:是否可以在不使用时间戳或显式设置我自己的 id 的情况下按创建顺序获取数据?

注意:我不反对使用时间戳或创建自己的 ID,我只是想知道这是否可行。

【问题讨论】:

【参考方案1】:

来自Core Data Programming Guide:

如何按照创建对象的顺序获取对象?

持久存储中的对象是无序的。通常,您应该在控制器或视图层施加顺序, 基于创建日期等属性。如果数据中存在固有顺序,则需要显式建模 那个。

所以是的,您必须使用时间戳或明确设置您自己的 id。

【讨论】:

【参考方案2】:

数据存储中没有记录创建顺序,所以没有。

如果您有一个有序的关系并且您确保将对象添加到此关系中的顺序与创建它们的顺序相同,那么该顺序将被保留。但是,您不会通过直接获取对象来获得它,而是通过遍历关系来获得它(即通过在具有有序关系的对象上查找它们)。

对于任何其他情况,唯一的顺序是您指定的顺序——时间戳、唯一 ID 等。

如果您使用时间戳,请确保使用足够的精度来处理在循环中创建的多个对象(例如,1 秒的精度几乎肯定不够好)。如果您使用递增的 ID,请确保在单个队列上分配值,以避免多线程重复。

【讨论】:

知道了,谢谢。我确实在创建对象时按顺序将对象添加到关系中。我将如何初始化NSSortDescriptor?用什么钥匙?谢谢。 有序关系表示为有序集合的实例,它有一个用于在特定索引或列表末尾添加的 API。您不会使用排序描述符,因为您不会使用获取请求。像这样使用有序关系的唯一方法是获取具有该关系的对象,然后获取有序列表相关对象。例如,获取它拥有的 Objection and see what Responses`。这些将被订购。

以上是关于CoreData:按创建的顺序获取和排序结果,不使用时间戳的主要内容,如果未能解决你的问题,请参考以下文章

按用户位置排序 NSFetchedResultsController 结果

如何获取指定的 CoreData 值? [关闭]

对获取的结果控制器进行排序,最后是空字符串

iphone coredata 获取请求排序

具有序列顺序的Coredata fetch-request

从按格式化日期排序的核心数据中获取