在可转换核心数据属性中使用字典时,CoreData 不会导入数据。我将附上设置和项目的屏幕截图。使用像 [String] 这样的自定义 NSSecureUnarchiveFromData 可以工作,但 Dictionary
仅当与 NSBatchInsert 请求中的字典结合使用时才会出现此问题。不幸的是,我有必要保留此配置,因为老用户的数据以该格式存储。创建像 Object(context: ...) 这样的 ManagedObjects 是可行的,但对于大数据集来说会变慢。
这是一个重现该错误的演示项目:https://github.com/NilsBerni/NSBatchInsertIos17Bug
您在 NSBatchInsert 和可转换属性(特别是字典方面)面临的问题是 iOS 17 (Xcode 15) 中的一个已知错误。当尝试导入带有字典作为可转换属性的数据时,此错误会导致 NSBatchInsert 失败。
不幸的是,这个错误没有直接的解决方法。但是,您可以考虑一些替代方法:
使用不同的数据类型:除了使用字典之外,您还可以考虑使用 Core Data 支持的其他数据类型,例如 NSData 或 NSSet。您可以将字典序列化为 NSData,然后再将其保存到可转换属性。
将字典拆分为单独的属性:如果可能,您可以在核心数据模型中将字典拆分为单独的属性。例如,如果您的字典具有键“key1”和“key2”,您可以在实体中创建两个单独的属性“attribute1”和“attribute2”,并将字典中的相应值存储在这些属性中。
使用单独的实体:您可以创建一个单独的实体来表示字典,而不是使用可转换属性。该实体可以有两个属性,“键”和“值”,您可以在主实体和该字典实体之间创建一对多关系。这样,您可以将每个键值对存储为单独的对象。
等待错误修复:您可以关注Apple的错误跟踪器和开发者论坛以获取有关此问题的任何更新。 Apple 可能会在未来版本的 iOS 中解决此错误。
同时,如果导入大型数据集时需要考虑性能,您可以考虑使用其他方法,例如 NSBatchUpdateRequest 或使用多个 NSBatchInsert 请求小批量导入数据。
还值得一提的是,您可以通过您分享的反馈助手链接向 Apple 提供反馈。这有助于引起人们对问题的关注,并增加在未来更新中解决该问题的机会。
祝你好运!