我正在使用CoreData在Xcode 9中构建iOS应用。我需要能够提供一组默认数据,这些数据既可以预填充应用程序,也可以用作默认数据,以防万一或重置应用程序。
我有以下代码用于使用plist导入单个数据数组:
private func preloadData() {
let preloadDataKey = "didPreloadData"
let userDefaults = UserDefaults.standard
if userDefaults.bool(forKey: preloadDataKey) == false {
guard let urlPath = Bundle.main.url(forResource: "PreloadData", withExtension: "plist") else { return }
let backgroundContext = persistentContainer.newBackgroundContext()
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
backgroundContext.perform {
if let arrayContents = NSArray(contentsOf: urlPath) as? [String] {
do {
for companyName in arrayContents {
let companyObject = Company(context: backgroundContext)
companyObject.name = companyName
}
try backgroundContext.save()
userDefaults.set(true, forKey: preloadDataKey)
} catch {
print(error.localizedDescription)
}
}
}
}
}
但是,我需要导入的数据与两个实体和每个实体的多个属性相关。我该怎么办?
答案 0 :(得分:1)
下面是一个带有两个实体CarMaker
和CarModel
的示例。我在plist中使用了一系列字典,每个字典都是一个CarModel
实例,并且该关系被非规范化,从而对每个CarMaker
重复了CarModel
的所有属性,在我的示例中,仅是属性
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Cars</key>
<array>
<dict>
<key>engine</key>
<string>Diesel</string>
<key>maker</key>
<string>Volvo</string>
<key>model</key>
<string>V70</string>
</dict>
<dict>
<key>engine</key>
<string>Petrol</string>
<key>maker</key>
<string>Volvo</string>
<key>model</key>
<string>XC90</string>
</dict>
</array>
</dict>
</plist>
在阅读本文时,我将在我的快速代码中使用一个缓存(字典),该缓存保存已创建的CarMaker实例,以避免Core Data中的重复