是否可以在NSSortDescriptor中为NSFetchedResultsController使用UUID?

问题描述

UUID中使用NSManagedobject的{​​{1}}属性时,应用程序崩溃:

-[__ NSConcreteUUID比较:]:无法识别的选择器已发送到实例

NSFetchedResultsController内容更改时,但第一次加载时不更改。首次加载时,对象会按UUID正确排序。

这就是我创建NSFetchedResultsController.fetchedobjects的方式:

NSFetchedResultsController

要创建let fetchRequest: NSFetchRequest<MyObject> = MyObject.fetchRequest() fetchRequest.sortDescriptors = [ NSSortDescriptor(key: #keyPath(MyObject.uuid),ascending: true),] fetchRequest.predicate = nspredicate(format: "%K == %@",#keyPath(MyObject.tag),tag) let controller = NSFetchedResultsController(fetchRequest: fetchRequest,managedobjectContext: context,sectionNameKeyPath: nil,cacheName: nil) controller.delegate = self do { try controller.performFetch() } catch { fatalError("###\(#function): Failed to performFetch: \(error)") } (在上面的代码中为NSManagedobject),我使用模型编辑器添加了类型为MyObject的字段“ uuid”。

似乎Core Data在sql级别上按UUID排序没有问题,但是在加载数据并尝试在内存中维护排序之后,它会尝试在以下位置调用UUID上的compare某种方式,它不作为一种方法存在。可以通过比较UUID的字节或字符串来实现此方法

尝试失败:

  • _NSConcreteUUID添加compareUUID的扩展名
  • Core Data不允许将NSUUID参数传递给comparator,这将终止应用程序

也许通过使用NSSortDescriptor有一种解决方法,它将使它从sql端的本机UUID类型中受益,但仍可以在Transformable内使用?

解决方法

否,无法使用UUID属性对Core Data结果进行排序。如果要使用UUID进行排序,则需要将其转换为字符串。

获取时,核心数据实际上并未按UUID排序。如果通过在Xcode的构建方案中的参数中添加-com.apple.CoreData.SQLDebug 4来打开Core Data SQLite调试,则可以看到此信息。当您对时间戳等数值属性进行排序时,调试输出将包含一个SQL ORDER BY子句

CoreData: sql: SELECT 0,t0.Z_PK FROM ZEVENT t0 ORDER BY t0.ZTIMESTAMP DESC

如果您使用UUID属性进行尝试,则没有ORDER BY子句。核心数据只是忽略排序描述符。它不会崩溃,但也不会对结果进行排序。

我不确定为什么会这样,因为使用sqlite3命令行工具打开Coreite创建的SQLite文件显示UUID属性表示为SQLite BLOB字段。 SQLite可以对BLOB进行排序,尽管这样做通常没有意义。

我建议向Apple提交错误。我不知道他们会如何考虑它的工作原理,但是它绝对不应该忽略排序描述符并且不打印某种控制台消息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...