1

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:

  1. An error occurring during Core Data persistent store migration in iOS 13
  2. 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.

Taras
  • 1,485
  • 1
  • 16
  • 31
  • The "near null" part is a very unusual error message. Someone else had almost exactly the same problem and worked around it. It doesn't seem like their workaround should be necessary but maybe it will help you: https://stackoverflow.com/questions/72408727/swift-core-data-migration-crash-syntax-error-in-select-maxz-pk-from-null – Tom Harrington Feb 18 '23 at 01:06
  • @TomHarrington thanks for your reply. I'll check that. But interesting fact that it works on simulator. – Taras Feb 18 '23 at 13:54
  • Yes I agree, that's odd – Tom Harrington Feb 19 '23 at 00:28
  • I read this description using ChatGPT "This error typically occurs when there is a syntax error in your migration script, as indicated by the "near 'null': syntax error" message. This means that there is a problem with the syntax of the SQL query used to migrate the persistent store." Do you have any idea of that? – Taras Feb 26 '23 at 07:58
  • @TomHarrington using mapping model didn't help me, unfortunately – Taras Feb 26 '23 at 08:00
  • I haven't seen this error before but it might be relevant that the first time `null` appears, it relates to an index on the `CardItemCD` entity. It might help to look carefully at any indexes you have on that entity to see if there's anything wrong or missing. – Tom Harrington Feb 27 '23 at 00:04
  • @TomHarrington what do you mean under 'indexes'? How can I check it? – Taras Feb 27 '23 at 06:15
  • In Core Data you can create indexes on specific properties for faster fetching. If you've never done that, then that's not it, but the SQL log makes it look like an index could be the problem. – Tom Harrington Feb 27 '23 at 17:01
  • oh I got it, thanks. @TomHarrington I have derived attributes. Will it be able a problem? – Taras Feb 28 '23 at 12:02
  • I don’t think so but this error is so unusual that it’s hard to say. But to be clear: Although this is a problem for you, it’s not your fault. Core Data should never produce SQL syntax errors. It’s a bug somewhere in the framework, not your own fault. You probably have tech support incidents with Apple and I really suggest you use one for this. – Tom Harrington Mar 01 '23 at 00:08
  • @TomHarrington hello, I asked Apple about their support, but they answered that this project is too big, so I need to create demo project. I have created demo project, but in that project I don't have that issue. Migration works as expected. – Taras Mar 25 '23 at 17:03

0 Answers0