Ios CoreData:从字典数组插入SQLite数据库是未排序的-因此不可能设置外键
我遵循了一个关于如何解析JSON文件并根据以下内容预加载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
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中。谢谢你的回答