【问题标题】:How do I Preload relational data in Xcode?如何在 Xcode 中预加载关系数据?
【发布时间】:2018-07-05 17:32:49
【问题描述】:

我正在使用 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)
            }
        }
      }
    }
}

但是,我需要导入的数据与两个实体和每个实体的多个属性相关。我该怎么做?

【问题讨论】:

  • 您说数据与两个实体相关,但您还没有解释为什么会出现问题?您的核心数据设计是否非常不同,或者维护关系存在问题或......?
  • 从我正在使用的示例中没有关系,它是一个单一的数组。但是,在我自己的应用程序中,有两个实体具有属性和它们之间的关系。我不熟悉 Plist 中如何显示此类信息。

标签: xcode core-data


【解决方案1】:

这是一个包含两个实体的示例,CarMakerCarModel。我在我的 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>

阅读本文时,我会在我的 swift 代码中使用缓存(字典)来保存已创建的 CarMaker 实例,以避免在 Core Data 中出现重复

【讨论】:

  • 我认为我们越来越接近这个。我的数据结构是这样的: 季节任务标题详细信息 季节和任务之间存在一对多的关系。会以与您上面的结构类似的结构完成吗?
  • 是的,因为在我的示例中,CarMaker 和 CarModel 之间存在一对多的关系。因此,为每个任务创建一个像上面这样的结构,其中每个任务还​​包含一个完整的季节对象。
  • 感谢您对此的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多