雨燕3
替换变量
型号名称
和
模型名称版本格式字符串
用于您的模型文件名
import XCTest
import CoreData
class RCCoreDataMigrationTests: XCTestCase {
private let storeType = NSSQLiteStoreType
private let modelName = "Model"
private let modelNameVersionFormatString = "Model-%@"
private func storeURL(_ version: String) -> URL? {
let storeURL = URL(fileURLWithPath: "\(NSTemporaryDirectory())\(version).sqlite" )
return storeURL
}
private func createObjectModel(_ version: String) -> NSManagedObjectModel? {
let bundle = Bundle.main
let managedObjectModelURL = bundle.url(forResource: modelName, withExtension: "momd")
let managedObjectModelURLBundle = Bundle(url: managedObjectModelURL!)
let modelVersionName = String(format: modelNameVersionFormatString, version)
let managedObjectModelVersionURL = managedObjectModelURLBundle!.url(forResource: modelVersionName, withExtension: "mom")
return NSManagedObjectModel(contentsOf: managedObjectModelVersionURL!)
}
private func createStore(_ version: String) -> NSPersistentStoreCoordinator {
let model = createObjectModel(version)
let storeCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model!)
try! storeCoordinator.addPersistentStore(ofType: storeType,
configurationName: nil,
at: storeURL(version),
options: nil)
return storeCoordinator
}
private func migrateStore(fromVersionMOM: String, toVersionMOM: String) {
let store = createStore(fromVersionMOM)
let nextVersionObjectModel = createObjectModel(toVersionMOM)!
let mappingModel = NSMappingModel(from: [Bundle.main], forSourceModel: store.managedObjectModel, destinationModel: nextVersionObjectModel)!
let migrationManager = NSMigrationManager(sourceModel: store.managedObjectModel, destinationModel: nextVersionObjectModel)
do {
try migrationManager.migrateStore(from: store.persistentStores.first!.url!,
sourceType: storeType,
options: nil,
with: mappingModel,
toDestinationURL: storeURL(toVersionMOM)!,
destinationType: NSSQLiteStoreType,
destinationOptions: nil)
} catch {
print("Error: \(error)")
XCTAssertNil(error)
}
try! FileManager.default.removeItem(at: storeURL(toVersionMOM)!)
try! FileManager.default.removeItem(at: storeURL(fromVersionMOM)!)
}
func testMigratingStores() {
migrateStore(fromVersionMOM: "1486", toVersionMOM: "1487")
}
}