CoreData批量同步启动关系不保存

时间:2019-03-22 02:23:17

标签: ios swift core-data

我从AppDelegate开始

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    CoreDataManager.shared.managedContext = self.persistentContainer.viewContext
    CoreDataManager.shared.model = self.persistentContainer.managedObjectModel

    SessionManager.shared.getCountries(completion: {
        SessionManager.shared.getStates(completion: {
            CoreDataManager.shared.updateCountryStateRelationships()
            CoreDataManager.shared.save()
        })
    })

    return true
}

然后这些方法最终在这里...

struct CoreDataManager {

    var countryCache = [String : NSManagedObjectID()

    func addCountry(name: String) {

        var country = insertEntity(with: "Country") as? Country
        country?.name = name
        ...
        ...

        countryCache[code] = country!.objectID
    }

    func addState(name: String) {

        var state = insertEntity(with: "State") as? State
        state?.name = name
        ...
        ...
    }

    func updateCountryStateRelationships() {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "State")
        let states = getAllManagedObjects(fetchRequest: fetchRequest) as! [State]
        for state in states {
            if let countryID = countryCache[state.countryCode!],
            let country = managedContext.object(with: countryID) as? Country {
                state.country = country
                country.addToStates(state)
            }
        }
    }

获取所有国家/地区,并在上下文中插入每个国家/地区。每个国家/地区管理对象ID保存在缓存字典中。添加所有国家/地区后,上下文将保存。

获取所有状态,并将每个状态插入上下文中。添加所有状态后,将保存上下文。

然后创建关系,每个国家可以有多个州,一个国家可以有一个国家。

国家和州可以很好地保存关系,看起来它们是正确创建的,但是当最后调用保存时,我得到一个核心数据错误。

NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1550.), NSValidationErrorKey=country, NSValidationErrorShouldAttemptRecoveryKey=true}

经过研究似乎表明我在保存时没有正确满足关系?那非可选的核心数据属性为nil?但是当我在关系上使用断点时,似乎一切设置都很好,没有任何事情以零结束。

如果您有任何见解,请告诉我。非常感谢!

0 个答案:

没有答案