持久存储迁移期间发生错误(无法就地迁移存储)Core Data

问题描述 投票:0回答:0

我添加了新的模型版本并像默认一样选择它。然后我在新模型版本中向现有实体添加了新属性。为了测试迁移,我安装了以前版本的应用程序并添加了应用程序中的所有数据。然后我安装新的更改并在模拟器上运行。如果我将该构建移动到 TestFlight 并通过真实设备进行测试,则会收到此错误:

Fatal error: ###persistentContainer: Failed to load persistent stores:Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={sourceURL=file:///private/var/mobile/Containers/Shared/AppGroup/DBB80C75-1B07-4318-8BA3-3F4FFC14FBD7/AppName.sqlite, reason=Cannot migrate store in-place: near "null": syntax error, destinationURL=file:///private/var/mobile/Containers/Shared/AppGroup/DBB80C75-1B07-4318-8BA3-3F4FFC14FBD7/AppName.sqlite, NSUnderlyingError=0x281958180 {Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={reason=near "null": syntax error, NSSQLiteErrorDomain=1, NSUnderlyingException=near "null": syntax error}}}

我也需要为 Widget 的目标使用 CoreData。代码在这里:

final class CoreDataStack {
    static let shared = CoreDataStack()
    var context: NSManagedObjectContext { persistentContainer.viewContext }
    var container: NSPersistentContainer { persistentContainer }
    private let containerName = "AppName"
    private var persistentContainer: NSPersistentContainer!

    // MARK: - Setup

    func setup() {
        guard let storeURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "app_group")?.appendingPathComponent(containerName + ".sqlite") else {
            fatalError("Error finding Model from File Manager")
        }
        let container = NSPersistentContainer(name: containerName)
        let description = NSPersistentStoreDescription(url: storeURL)
        description.type = NSSQLiteStoreType
        description.shouldMigrateStoreAutomatically = true
        description.shouldInferMappingModelAutomatically = true
        container.persistentStoreDescriptions = [description]
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        container.viewContext.transactionAuthor = appTransactionAuthorName
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.loadPersistentStores(completionHandler: { (_, error) in
            if let error = error as NSError? {
                let crashlitycService: CrashlitycUseCase = CrashlitycService()
                crashlitycService.record(error: .errorForAnalytic(error), file: #file, function: #function, line: #line)
                fatalError("###\(#function): Failed to load persistent stores:\(error)")
            }
        })
        self.persistentContainer = container
    }
}

iOS 16.2 Xcode 14.1

我在这里发现的类似问题,但没有成功:

  1. 在 iOS 13 中迁移 Core Data 持久存储期间发生的错误
  2. iOS 应用程序由于核心数据迁移而在启动屏幕上崩溃

我通过添加 2 个属性更新了

RepeatedDateCD
itemState
notificationSource
。都是
Int16
,不可选。 这是迁移日志:


CoreData: annotation: (migration) inferring a mapping model between data models with 
 source hashes: 
{
    CardItemCD = {length = 32, bytes = 0x6b3ed487 5d72e095 dbe4bec9 63589c03 ... 324c6265 1a670bee };
    RepeatedDateCD = {length = 32, bytes = 0xe55b9c24 731269b7 b69c168c 24b95365 ... fc20bb11 831324c5 };
}
 destination hashes: {
    CardItemCD = {length = 32, bytes = 0x6b3ed487 5d72e095 dbe4bec9 63589c03 ... 324c6265 1a670bee };
    RepeatedDateCD = {length = 32, bytes = 0xb438483e b383a379 ebc3c536 5ef46588 ... 36870c30 f64f30ed };
}

CoreData: annotation: Connecting to sqlite database file at "/private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite"
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ATRANSACTION'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ATRANSACTIONSTRING'
CoreData: sql: SELECT count(*) FROM (SELECT 0 FROM ATRANSACTION LIMIT 1)
CoreData: annotation: sql execution time: 0.0005s
CoreData: annotation: Connecting to sqlite database file at "/private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite"
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: annotation: Finished creating schema migration statements
CoreData: annotation: Beginning formal transaction
CoreData: sql: BEGIN EXCLUSIVE
CoreData: annotation: Checking metadata

CoreData: annotation: Executing entity schema & data migration statement: NSSQLiteStatement <0x280e26170> on entity 'RepeatedDateCD' with sql text 'ALTER TABLE ZREPEATEDDATECD ADD COLUMN ZNOTIFICATIONSOURCE INTEGER'
CoreData: sql: ALTER TABLE ZREPEATEDDATECD ADD COLUMN ZNOTIFICATIONSOURCE INTEGER
CoreData: annotation: Executing entity schema & data migration statement: NSSQLiteStatement <0x280e26210> on entity 'RepeatedDateCD' with sql text 'ALTER TABLE ZREPEATEDDATECD ADD COLUMN ZITEMSTATE INTEGER'
CoreData: sql: ALTER TABLE ZREPEATEDDATECD ADD COLUMN ZITEMSTATE INTEGER
CoreData: annotation: Executing entity schema & data migration statement: NSSQLiteStatement <0x280e25e00> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ZCARDITEMCD_ZDECK_INDEX ON ZCARDITEMCD (ZDECK)'

CoreData: annotation: Begin updating default values.
CoreData: sql: UPDATE ZREPEATEDDATECD SET ZNOTIFICATIONSOURCE = ?
CoreData: sql: UPDATE ZREPEATEDDATECD SET ZITEMSTATE = ?
CoreData: annotation: Finished updating default values.
CoreData: annotation: Begin updating derived properties.


CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b110> on entity '(null)' with sql text 'UPDATE OR FAIL ACHANGE SET ZCOLUMNS = NSPersistentHistoryMigrateUpdates(3, 8, 8, ZCOLUMNS) WHERE ZENTITY == 8 AND ZCHANGETYPE == 1;'
CoreData: sql: UPDATE OR FAIL ACHANGE SET ZCOLUMNS = NSPersistentHistoryMigrateUpdates(3, 8, 8, ZCOLUMNS) WHERE ZENTITY == 8 AND ZCHANGETYPE == 1;
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b0c0> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ACHANGE_ZTRANSACTIONID_INDEX ON ACHANGE (ZTRANSACTIONID)'
CoreData: sql: CREATE INDEX IF NOT EXISTS ACHANGE_ZTRANSACTIONID_INDEX ON ACHANGE (ZTRANSACTIONID)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b070> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ATRANSACTION_ZAUTHORTS_INDEX ON ATRANSACTION (ZAUTHORTS)'
CoreData: sql: CREATE INDEX IF NOT EXISTS ATRANSACTION_ZAUTHORTS_INDEX ON ATRANSACTION (ZAUTHORTS)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b160> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ATRANSACTION_ZBUNDLEIDTS_INDEX ON ATRANSACTION (ZBUNDLEIDTS)'
CoreData: sql: CREATE INDEX IF NOT EXISTS ATRANSACTION_ZBUNDLEIDTS_INDEX ON ATRANSACTION (ZBUNDLEIDTS)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b1b0> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ATRANSACTION_ZCONTEXTNAMETS_INDEX ON ATRANSACTION (ZCONTEXTNAMETS)'
CoreData: sql: CREATE INDEX IF NOT EXISTS ATRANSACTION_ZCONTEXTNAMETS_INDEX ON ATRANSACTION (ZCONTEXTNAMETS)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b200> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ATRANSACTION_ZPROCESSIDTS_INDEX ON ATRANSACTION (ZPROCESSIDTS)'
CoreData: sql: CREATE INDEX IF NOT EXISTS ATRANSACTION_ZPROCESSIDTS_INDEX ON ATRANSACTION (ZPROCESSIDTS)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b250> on entity 'TRANSACTION' with sql text 'CREATE INDEX IF NOT EXISTS Z_TRANSACTION_TransactionAuthorIndex ON ATRANSACTION (ZAUTHOR COLLATE BINARY ASC)'
CoreData: sql: CREATE INDEX IF NOT EXISTS Z_TRANSACTION_TransactionAuthorIndex ON ATRANSACTION (ZAUTHOR COLLATE BINARY ASC)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b2a0> on entity 'TRANSACTION' with sql text 'CREATE INDEX IF NOT EXISTS Z_TRANSACTION_TransactionTimestampIndex ON ATRANSACTION (ZTIMESTAMP COLLATE BINARY ASC)'
CoreData: sql: CREATE INDEX IF NOT EXISTS Z_TRANSACTION_TransactionTimestampIndex ON ATRANSACTION (ZTIMESTAMP COLLATE BINARY ASC)
CoreData: annotation: Executing history migration statement: NSSQLiteStatement <0x280e3b340> on entity 'TRANSACTIONSTRING' with sql text 'CREATE UNIQUE INDEX IF NOT EXISTS Z_TRANSACTIONSTRING_UNIQUE_NAME ON ATRANSACTIONSTRING (ZNAME COLLATE BINARY ASC)'
CoreData: sql: CREATE UNIQUE INDEX IF NOT EXISTS Z_TRANSACTIONSTRING_UNIQUE_NAME ON ATRANSACTIONSTRING (ZNAME COLLATE BINARY ASC)
CoreData: annotation: Completed persistent history metadata tables update
CoreData: annotation: Updating metadata
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: DELETE FROM Z_METADATA WHERE Z_VERSION = ?
CoreData: sql: INSERT INTO Z_METADATA (Z_VERSION, Z_UUID, Z_PLIST) VALUES (?, ?, ?)
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: DELETE FROM Z_MODELCACHE
CoreData: sql: INSERT INTO Z_MODELCACHE (Z_CONTENT) VALUES (?)
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TYPE = "table" ORDER BY TBL_NAME
CoreData: sql: SELECT MAX(Z_PK) FROM (null)

[logging] near "null": syntax error in "SELECT MAX(Z_PK) FROM (null)"
CoreData: annotation: Failed lightweight migration on connection
CoreData: annotation: Rolling back formal transaction
CoreData: sql: ROLLBACK
CoreData: annotation: Disconnecting from sqlite database.
CoreData: annotation: Disconnecting from sqlite database.
CoreData: annotation: (migration) leaving incompletely migrated store on disk after in-place migration error. (file:///private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite, Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={reason=near "null": syntax error, NSSQLiteErrorDomain=1, NSUnderlyingException=near "null": syntax error})
2023-02-26 10:05:03.465461+0200 AppName dev[57435:3173716] [error] error: CoreData: error: (migration) migration failed with error Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={sourceURL=file:///private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite, reason=Cannot migrate store in-place: near "null": syntax error, destinationURL=file:///private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite, NSUnderlyingError=0x282388180 {Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={reason=near "null": syntax error, NSSQLiteErrorDomain=1, NSUnderlyingException=near "null": syntax error}}}
Error User Info: {
    NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"An error occurred during persistent store migration.\" UserInfo={reason=near \"null\": syntax error, NSSQLiteErrorDomain=1, NSUnderlyingException=near \"null\": syntax error}";
    destinationURL = "file:///private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite";
    reason = "Cannot migrate store in-place: near \"null\": syntax error";
    sourceURL = "file:///private/var/mobile/Containers/Shared/AppGroup/23DB21D1-1646-4B2A-A513-0A6AF5130B4D/AppName.sqlite";
}

请帮我弄清楚如何进行此迁移?

ios sql swift core-data core-data-migration
© www.soinside.com 2019 - 2024. All rights reserved.