SwiftData error: Attempting to retrieve an NSManagedObjectModel version checksum while the model is still editable

Hi,

I'm getting a very odd error log in my SwiftData setup for an iOS app. It is implemented to support schema migration. When starting the app, it simply prints the following log twice (seems to be dependent on how many migration steps, I have two steps in my sample code):

CoreData: error: Attempting to retrieve an NSManagedObjectModel version checksum while the model is still editable. This may result in an unstable verison checksum. Add model to NSPersistentStoreCoordinator and try again.

(Yes there is a mistyped word "verison", this is exactly the log)

The code actually fully works. But I have neither CloudKit configured, nor is this app in Production yet. I'm still just developing.

Here is the setup and code to reproduce the issue.

  • Development mac version: macOS 15.5
  • XCode version: 16.4
  • iOS Simulator version: 18.5
  • Real iPhone version: 18.5
  • Project name: SwiftDataDebugApp

SwiftDataDebugApp.swift:

import SwiftUI
import SwiftData

@main
struct SwiftDataDebugApp: App {
    var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            Item.self,
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false, allowsSave: true)

        do {
            return try ModelContainer(for: schema, migrationPlan: ModelMigraitonPlan.self, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(sharedModelContainer)
    }
}

Item.swift:

import Foundation
import SwiftData

typealias Item = ModelSchemaV2_0_0.Item

enum ModelSchemaV1_0_0: VersionedSchema {
    static var versionIdentifier = Schema.Version(1, 0, 0)
    static var models: [any PersistentModel.Type] {
        [Item.self]
    }
    
    @Model
    final class Item {
        var timestamp: Date
        
        init(timestamp: Date) {
            self.timestamp = timestamp
        }
    }
}

enum ModelSchemaV2_0_0: VersionedSchema {
    static var versionIdentifier = Schema.Version(2, 0, 0)
    static var models: [any PersistentModel.Type] {
        [Item.self]
    }
    
    @Model
    final class Item {
        var timestamp: Date
        var tags: [Tag] = []
        
        init(timestamp: Date, tags: [Tag]) {
            self.timestamp = timestamp
            self.tags = tags
        }
    }
}

enum ModelMigraitonPlan: SchemaMigrationPlan {
    static var schemas: [any VersionedSchema.Type] {
        [ModelSchemaV1_0_0.self]
    }
    
    static var stages: [MigrationStage] {
        [migrationV1_0_0toV2_0_0]
    }
    
    static let migrationV1_0_0toV2_0_0 = MigrationStage.custom(
        fromVersion: ModelSchemaV1_0_0.self,
        toVersion: ModelSchemaV2_0_0.self,
        willMigrate: nil,
        didMigrate: { context in
            let items = try context.fetch(FetchDescriptor<ModelSchemaV2_0_0.Item>())
            for item in items {
                item.tags = Array(repeating: "abc", count: Int.random(in: 0...3)).map({ Tag(value: $0) })
            }
            try context.save()
        }
    )
}

Tag.swift:

import Foundation

struct Tag: Codable, Hashable, Comparable {
    var value: String
    
    init(value: String) {
        self.value = value
    }
    
    static func < (lhs: Tag, rhs: Tag) -> Bool {
        return lhs.value < rhs.value
    }
    
    static func == (lhs: Tag, rhs: Tag) -> Bool {
        return lhs.value == rhs.value
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(value)
    }
}

ContentView.swift:

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var items: [Item]

    var body: some View {
        VStack {
            List {
                ForEach(items) { item in
                    VStack(alignment: .leading) {
                        Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
                        HStack {
                            ForEach(item.tags, id: \.hashValue) { tag in
                                Text("\(tag.value)")
                            }
                        }
                    }
                }
                .onDelete(perform: deleteItems)
            }
            
            Button("Add") {
                addItem()
            }
            .padding(.top)
        }
    }

    private func addItem() {
        withAnimation {
            let newItem = Item(timestamp: Date(), tags: [Tag(value: "Hi")])
            modelContext.insert(newItem)
        }
        
        do {
            try modelContext.save()
        } catch {
            print("Error saving add: \(error.localizedDescription)")
        }
    }
    
    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            for index in offsets {
                modelContext.delete(items[index])
            }
        }
        
        do {
            try modelContext.save()
        } catch {
            print("Error saving delete: \(error.localizedDescription)")
        }
    }
}

#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}

I hope someone can help, couldn't find anything related to this log at all.

Answered by DTS Engineer in 849310022

Yeah, that is a known issue. Did you try with the version 26 system and Xcode (beta 4 as of today)? If the issue is still there, I'd suggest that you file a feedback report and share your report ID here.

I haven't seen the error really impacting the functions in any way, and so see it log noice that can be ignored.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Accepted Answer

Yeah, that is a known issue. Did you try with the version 26 system and Xcode (beta 4 as of today)? If the issue is still there, I'd suggest that you file a feedback report and share your report ID here.

I haven't seen the error really impacting the functions in any way, and so see it log noice that can be ignored.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

I have not tried on iOS 26 yet, I will have to wait until it is out of beta unfortunately.

I agree, that this is probably just log noise, since my implementation is actually working. That is good then, I can move forward with this, thanks :)

SwiftData error: Attempting to retrieve an NSManagedObjectModel version checksum while the model is still editable
 
 
Q