CoreData:从字典数组插入到SQLite数据库中发生未排序 - 因此无法设置外键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoreData:从字典数组插入到SQLite数据库中发生未排序 - 因此无法设置外键相关的知识,希望对你有一定的参考价值。

我按照以下教程学习了如何从JSON文件解析并预加载sqlite数据库:https://medium.com/@jamesrochabrun/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f

在此方法中,已解析的数据(即字典数组)将被映射:

private func saveInCoreDataWith(array: [[String: AnyObject]]) {
    _ = array.map{self.createPhotoEntityFrom(dictionary: $0)}
    do {
        try CoreDataStack.sharedInstance.persistentContainer.viewContext.save()
    } catch let error {
        print(error)
    }
}

在此方法中,映射数据将逐个插入到数据库文件中:

private func createPhotoEntityFrom(dictionary: [String: AnyObject]) -> NSManagedObject? {
    let context = CoreDataStack.sharedInstance.persistentContainer.viewContext
    if let photoEntity = NSEntityDescription.insertNewObject(forEntityName: "Photo", into: context) as? Photo {
        photoEntity.author = dictionary["author"] as? String
        photoEntity.tags = dictionary["tags"] as? String
        let mediaDictionary = dictionary["media"] as? [String: AnyObject]
        photoEntity.mediaURL = mediaDictionary?["m"] as? String
        return photoEntity
    }
    return nil
}

我注意到,数据以未排序的方式插入,而不是根据数组在插入之前的排序方式。通常,当我只有一个实体时,这不会打扰我。但是在我的项目中,我有3个实体,它们之间有不同的关系。因此我还需要将外键设置到表中。但这是不可能的,因为我不知道在将数据插入表格时最初将设置哪些主键。

有没有办法告诉SWIFT插入已排序的数据或至少根据排序的数组?或者是否有另一种方法可以在插入表格时确定正确的外键?

答案

核心数据中唯一的订单是您告诉它的订单。订购不是自动的。在大多数情况下,最好在获取数据时使用排序描述符,以便您可以获取按实体属性排序的获取结果(例如,按日期排序)。如果您需要强制执行特定订单,则您的实体需要具有指示订单的属性。添加一个名为sortOrder的额外整数字段,并为其提供您喜欢的任何值。然后使用sortOrder字段对排序描述符进行排序。

相关的,您的问题以无意义的方式将SQL概念应用于Core Data。例如,期望自动递增索引。想要使用外键来建立关系。核心数据在内部使用SQLite,但它不像SQL那样工作,并将其视为SQL将导致您做出糟糕的设计决策,如使用外键。如果你真的想要SQLite,你可以在没有Core Data的情况下直接使用它。如果您要使用Core Data,您将从阅读它的工作原理中受益,而不是像SQL一样对待它。

另一答案

CoreData插入不保证托管对象的存储顺序。保持记录的顺序您需要创建负责订单的自定义字段并在获取时执行排序。

以上是关于CoreData:从字典数组插入到SQLite数据库中发生未排序 - 因此无法设置外键的主要内容,如果未能解决你的问题,请参考以下文章

coredata索引直接插入sqlite文件

将改造数组数据插入到 sqlite

从 Sqlite 迁移到 CoreData

从 sqlite3 迁移到 CoreData?

如何在 CoreData 中保存字典数组?

Python将字典插入sqlite3