I added new model version and select it like default one. Then I added new attribute to existing entity in new model version. To test migration I installed previous version of app and add filled with all data in app. Then I install new changes and it work on simulator. If I move that build to TestFlight and test via real device then I get this error:
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}}}
I need to use CoreData for Widget's target as well. Code is here :
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
Similar issues I found here, but without any success:
- An error occurring during Core Data persistent store migration in iOS 13
- iOS app crashing on launch screen due to core data migration
I updated RepeatedDateCD
by adding 2 attributes: itemState
, notificationSource
. Both are Int16
, not optional.
Here is logs of migration:
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";
}
Please help me to figure out how can I do this migration?
UPD 2023.03.25: I see this message in console:
CoreData: sql: ALTER TABLE ZREPEATEDDATECD ADD COLUMNZNOTIFICATIONSOURCE INTEGER
CoreData: annotation: Executing entity schema & data migration statement: NSSQLiteStatement <0x283d3cf50> on entity '(null)' with sql text 'CREATE INDEX IF NOT EXISTS ZCARDITEMCD_ZDECK_INDEX ON ZCARDITEMCD (ZDECK)'
And ChatGPT get answer this issue: The message includes the text "(null)" in place of the entity name, which suggests that CoreData was unable to determine the name of the entity that is being migrated. This can occur if the entity has been deleted or renamed in the new data model version, but there are still references to it in the old data model.
But I didn't neither delete that entity nor rename.