Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData:从字典数组插入SQLite数据库是未排序的-因此不可能设置外键_Ios_Json_Swift_Sqlite_Core Data - Fatal编程技术网

Ios CoreData:从字典数组插入SQLite数据库是未排序的-因此不可能设置外键

Ios CoreData:从字典数组插入SQLite数据库是未排序的-因此不可能设置外键,ios,json,swift,sqlite,core-data,Ios,Json,Swift,Sqlite,Core Data,我遵循了一个关于如何解析JSON文件并根据以下内容预加载sqlite数据库的教程: 在此方法中,解析数据(字典数组)被映射为: private func saveInCoreDataWith(array: [[String: AnyObject]]) { _ = array.map{self.createPhotoEntityFrom(dictionary: $0)} do { try CoreDataStack.sharedInstance.persisten

我遵循了一个关于如何解析JSON文件并根据以下内容预加载sqlite数据库的教程:

在此方法中,解析数据(字典数组)被映射为:

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插入已排序的数据或至少根据已排序的数组插入数据?或者,在插入表时,是否有其他方法确定正确的外键?

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

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


与此相关,您的问题将SQL概念应用于核心数据的方式毫无意义。例如,应为自动递增索引。想要为关系使用外键。核心数据在内部使用SQLite,但它的工作方式与SQL不同,将其视为SQL会导致您做出错误的设计决策,例如使用外键。如果你真的想要SQLite,你可以直接使用它而不需要核心数据。如果你打算使用核心数据,你将受益于阅读它的工作原理,而不是像SQL一样对待它。

在核心数据中,你不应该担心外键。你说我需要创建负责订单的custome字段是什么意思?只需添加一些负责订单的字段并将其存储在DB中。谢谢你的回答