使用 Core Data 进行排序的 fetchRequest 有啥限制?

Posted

技术标签:

【中文标题】使用 Core Data 进行排序的 fetchRequest 有啥限制?【英文标题】:What are the limits of making a sorted fetchRequest with Core Data?使用 Core Data 进行排序的 fetchRequest 有什么限制? 【发布时间】:2013-10-16 10:29:19 【问题描述】:

简而言之:

根据不是attribute@property 获取实体并对其进行排序将在第二次运行时导致错误(涉及NSDictionaryMapNode)。

这是正常的还是错误的?您对此有何评论或帮助?


长篇:

情况如下。

我有一个Entity 有两个属性attribute1attribute2

我已经生成了 [1] 一个类 Entity.m 并在其中添加了一个名为 myProperty@property。因此,myProperty 是我的班级 Entity.m@property,但不是实体 Entity 的属性。顺便说一句,myPropertyreadonly(假设它类似于 attribute1attribute2 连接。

现在,我执行以下操作:

NSManagedObjectContext * myContext = ... ;
NSFetchRequest * myRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
NSSortDescriptor * mySortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"myProperty"
                                                                    ascending:YES] ;
NSError *error ;

[myRequest setSortDescriptors:@[mySortDescriptor]] ;

NSArray * result  = [myContext executeFetchRequest:myRequest
                                             error:&error] ;

第一次执行这段代码时,我没有任何错误。

第二次,我得到以下错误:

[<NSDictionaryMapNode 0x1020cf310> valueForUndefinedKey:]: this class is not key value coding-compliant for the key myProperty.

我知道问题来自myProperty 不是Entity 的属性。我的帖子的目的是提出这种情况,并了解您是否会对这种情况发表任何评论。

[1] 使用 mogenerator (https://github.com/rentzsch/mogenerator)。

【问题讨论】:

你想听什么?您已经发现可以在 Core Data 排序描述符中仅使用持久属性没有办法。 (如果所有对象都加载到内存中,它可能不会在第一次崩溃。) 听到“(如果所有对象都加载到内存中,它可能不会在第一次崩溃。)”很有趣! 但这纯粹是猜测。您不能将这样的排序描述符与 fetch 请求一起使用,即使它可能不会立即崩溃。当然你可以先获取,然后使用任何排序描述符对获取的数组进行排序。 好的,想象一下我的情况,我是Core Data 的新手。我发现了一个“错误”,网络上没有参考,文档没有说任何精确的内容。很高兴听到:“是的,我们知道,这很正常。你不能那样做,你是对的,一切都很正常。没有出路”。 那我没有正确理解你的问题。但它已记录在案,Wain 已为您提供了链接。 【参考方案1】:

这是众所周知的。您无法对商店中不持久的任何内容进行排序。它永远不应该工作(第一次工作意味着你没有 MOC 或类似的东西)。

您应该为持久化的实体添加一个新属性。执行类似实现willSave 或观察依赖键并使用该触发器更新新属性的值(myProperty)。


见Core Data Programming Guide的Fetch Predicates and Sort Descriptors部分

【讨论】:

我要做的是:1)我获取我的请求,2)我对其进行排序。 我添加了文档链接。请注意,当您因为没有足够的 RAM 而无法获取所有数据时,最终会遇到限制。

以上是关于使用 Core Data 进行排序的 fetchRequest 有啥限制?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSSortDescriptor、Core Data 和 NSFetchedResultsController 按日期和名称对 UITableView 进行排序

在 Swift Core Data 中对存储的数据模型提取进行排序

在 SwiftUI 中将 @FetchRequest 与 Core Data 一起使用时修改 nil 排序行为

如何在 GROUP BY 之前对 Core Data 记录进行排序?

如何根据相关对象集合的属性对 Core Data 结果进行排序?

Core Data 根据是不是存在关系对描述符进行排序?