使用 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
有两个属性attribute1
和attribute2
。
我已经生成了 [1] 一个类 Entity.m
并在其中添加了一个名为 myProperty
的 @property
。因此,myProperty
是我的班级 Entity.m
的 @property
,但不是实体 Entity
的属性。顺便说一句,myProperty
是 readonly
(假设它类似于 attribute1
与 attribute2
连接。
现在,我执行以下操作:
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
的属性。我的帖子的目的是提出这种情况,并了解您是否会对这种情况发表任何评论。
【问题讨论】:
你想听什么?您已经发现可以在 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 记录进行排序?