我从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?但是当我在关系上使用断点时,似乎一切设置都很好,没有任何事情以零结束。
如果您有任何见解,请告诉我。非常感谢!