代码之家  ›  专栏  ›  技术社区  ›  forrest

如何在xcode中预加载关系数据?

  •  0
  • forrest  · 技术社区  · 7 年前

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Joakim Danielson    7 年前

    下面是一个有两个实体的例子, 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代码中使用一个缓存(字典),它保存已经创建的汽车制造商实例,以避免核心数据中的重复。