Hi,
I am currently experiencing some trouble when using parent model property in a predicate of a child model.
I have an Item class that define parent-child relationship:
@Model class Item {
	var timestamp: Date
	@Relationship(inverse: \Item.children)
	var parent: Item?
	var children: [Item]
	init(parent: Item? = nil, children: [Item] = [], timestamp: Date = .now) {
		self.parent = parent
		self.children = children
		self.timestamp = timestamp
	}
}
I subclass this model like that:
@available(iOS 26, *)
@Model final class CollectionItem: Item { /* ... */ }
When i make a Query in my View like that the system crashes:
@Query(
	filter: #Predicate<CollectionItem> { $0.parent == nil },
	sort: \CollectionItem.name,
)
private var collections: [CollectionItem]
    CrashReportError: Fatal Error in DataUtilities.swift
    
    AppName crashed due to fatalError in DataUtilities.swift at line 85.
    
    Couldn't find \CollectionItem.<computed 0x000000034005d4e8 (Optional<Item>)> on CollectionItem with fields [SwiftData.Schema.PropertyMetadata(name: "name", keypath: \CollectionItem.<computed 0x000000034003c120 (String)>, defaultValue: nil, metadata: nil), SwiftData.Schema.PropertyMetadata(name: "icon", keypath: \CollectionItem.<computed 0x000000034003ca04 (Optional<String>)>, defaultValue: nil, metadata: nil), SwiftData.Schema.PropertyMetadata(name: "timestamp", keypath: \Item.<computed 0x0000000340048018 (Date)>, defaultValue: nil, metadata: nil), SwiftData.Schema.PropertyMetadata(name: "parent", keypath: \Item.<computed 0x0000000340048a4c (Optional<Item>)>, defaultValue: nil, metadata: Optional(Relationship - name: , options: [], valueType: Any, destination: , inverseName:  nil, inverseKeypath: Optional(\Item.<computed 0x0000000340048fe8 (Array<Item>)>))), SwiftData.Schema.PropertyMetadata(name: "children", keypath: \Item.<computed 0x0000000340048fe8 (Array<Item>)>, defaultValue: nil, metadata: nil)]
When I query as Item it works but then i cannot sort on CollectionItem field and must add unnecessary down casting:
@Query(
	filter: #Predicate<Item> { $0.parent == nil && $0 is CollectionItem },
)
private var items: [Item]
Am I missing something? Is it a platform limitation or a known issue?
                    
                  
                iCloud & Data
RSS for tagLearn how to integrate your app with iCloud and data frameworks for effective data storage
  
    
    Selecting any option will automatically load the page
  
  
  
  
    
  
  
            Post
Replies
Boosts
Views
Activity
                    
                      I'm seeing a lot of these in my logs:
PersistentIdentifier PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(url: x-swiftdata://Course/BC9CF99A-DE6A-46F1-A18D-8034255A56D8), implementation: SwiftData.PersistentIdentifierImplementation) was remapped to a temporary identifier during save: PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(url: x-coredata:///Course/t58C849CD-D895-4773-BF53-3F63CF48935B210), implementation: SwiftData.PersistentIdentifierImplementation). This is a fatal logic error in DefaultStore
... though everything seems to work.
Does anyone know what this means in this context? Anything I can do to not have this appear?
                    
                  
                
                    
                      I've already submitted this as a bug report to Apple, but I am posting here so others can save themselves some troubleshooting. This is submitted as FB14337982 with an attached complete Xcode project to replicate.
In iOS 17 we use a ModelActor to download data which is saved as an Event, and then save it to SwiftData with a relationship to a Location. In iOS 18 22A5307d we are seeing that this code no longer persists the relationship to the Location, but still saves the Event. If we put a breakpoint in that ModelActor we see that the object graph is correct within the ModelActor stack trace at the time we call modelContext.save(). However, after saving, the relationship is missing from the default.store SQLite file, and of course from the app UI.
Here is a toy example showing how inserting an Employee into a Company using a ModelActor gives unexpected results in iOS 18 22A5307d but works as expected in iOS 17.
It appears that no relationships data survives being saved in a ModelActor.ModelContext.
Also note there seems to be a return of the old bug that saving this data in the ModelActor does not update the @Query in the UI in iOS 18 but does so in iOS 17.
Models
@Model
final class Employee {
    var uuid: UUID = UUID()
    @Relationship(deleteRule: .nullify) public var company: Company?
    /// For a concise display
    @Transient var name: String {
        self.uuid.uuidString.components(separatedBy: "-").first ?? "NIL"
    }
    
    init(company: Company?) {
        self.company = company
    }
}
@Model
final class Company {
    var uuid: UUID = UUID()
    
    @Relationship(deleteRule: .cascade, inverse: \Employee.company)
    public var employees: [Employee]? = []
    /// For a concise display
    @Transient var name: String {
        self.uuid.uuidString.components(separatedBy: "-").first ?? "NIL"
    }
    init() { }
}
ModelActor
import OSLog
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "SimpleModelActor")
@ModelActor
final actor SimpleModelActor {
    func addEmployeeTo(CompanyWithID companyID: PersistentIdentifier?) {
        guard let companyID,
              let company: Company = self[companyID, as: Company.self] else {
            logger.error("Could not get a company")
            return
        }
            
        let newEmployee = Employee(company: company)
        modelContext.insert(newEmployee)
        logger.notice("Created employee \(newEmployee.name) in Company \(newEmployee.company?.name ?? "NIL")")
        try! modelContext.save()
    }
}
ContentView
import OSLog
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "View")
struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var companies: [Company]
    @Query private var employees: [Employee]
    @State private var simpleModelActor: SimpleModelActor!
    var body: some View {
        ScrollView {
            LazyVStack {
                DisclosureGroup("Instructions") {
                    Text("""
                    Instructions:
                    1. In iOS 17, tap Add in View. Observe that an employee is added with Company matching the shown company name.
                    2. In iOS 18 beta (22A5307d), tap Add in ModelActor. Note that the View does not update (bug 1). Note in the XCode console that an Employee was created with a relationship to a Company.
                    3. Open the default.store SQLite file and observe that the created Employee does not have a Company relationship (bug 2). The relationship was not saved.
                    4. Tap Add in View. The same code is now executed in a Button closure. Note in the XCode console again that an Employee was created with a relationship to a Company. The View now updates showing both the previously created Employee with NIL company, and the View-created employee with the expected company.
                    """)
                    .font(.footnote)
                }
                .padding()
                Section("**Companies**") {
                    ForEach(companies) { company in
                        Text(company.name)
                    }
                }
                .padding(.bottom)
                
                Section("**Employees**") {
                    ForEach(employees) { employee in
                        Text("Employee \(employee.name) in company \(employee.company?.name ?? "NIL")")
                    }
                }
                Button("Add in View") {
                    let newEmployee = Employee(company: companies.first)
                    modelContext.insert(newEmployee)
                    logger.notice("Created employee \(newEmployee.name) in Company \(newEmployee.company?.name ?? "NIL")")
                    try! modelContext.save()
                }
                .buttonStyle(.bordered)
                Button("Add in ModelActor") {
                    Task {
                        await simpleModelActor.addEmployeeTo(CompanyWithID: companies.first?.persistentModelID)
                    }
                }
                .buttonStyle(.bordered)
            }
        }
        .onAppear {
            simpleModelActor = SimpleModelActor(modelContainer: modelContext.container)
            if companies.isEmpty {
                let newCompany = Company()
                modelContext.insert(newCompany)
                try! modelContext.save()
            }
        }
    }
}
                    
                  
                
                    
                      anyone getting the following error with CloudKit+CoreData on iOS16 RC?
delete/resintall app, delete user CloudKit data and reset of environment don't fix.
[error] error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _requestAbortedNotInitialized:](2044): <NSCloudKitMirroringDelegate: 0x2816f89a0> - Never successfully initialized and cannot execute request '<NSCloudKitMirroringImportRequest: 0x283abfa00> 41E6B8D6-08C7-4C73-A718-71291DFA67E4' due to error: Error Domain=NSCocoaErrorDomain Code=4864 "*** -[NSKeyedUnarchiver _initForReadingFromData:error:throwLegacyExceptions:]: incomprehensible archive (0x53, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x78, 0x61)" UserInfo={NSDebugDescription=*** -[NSKeyedUnarchiver _initForReadingFromData:error:throwLegacyExceptions:]: incomprehensible archive (0x53, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x78, 0x61)}
                    
                  
                
                    
                      Posting here to see if folks have workarounds or if I have a misunderstanding of SwiftData supported types.
In adopting SwiftData, I have swiftData properties of collection type (Array or Set - both have this issue). E.g:
@Model
final class Item {
    var timestamp: Date
    var strings = ["aa", "bb"]
    
    var display: String {
        strings.joined(separator: " ")
    }
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}
So far in development I haven't had issues on iOS 17, but on the iOS 18 betas 4-5 the app logs show the following error:
"fault: Could not materialize Objective-C class named "Array" from declared attribute value type "Array<String>" of attribute named strings"
It happens immediately in my app when creating an object with a collection attribute.
In a minimal test example, the error log appears only after a few minutes and doesn't seem to affect the template app's basic functionality.
Anyone else running into this?
Was filed as FB14397250
                    
                  
                
                    
                      I have created an actor for the ModelContainer, in order to perform a data load when starting the app in the background. For this I have conformed to the ModelActor protocol and created the necessary elements, even preparing for test data.
Then I create a function of type async throws to perform the database loading processes and everything works fine, in that the data is loaded and when loaded it is displayed reactively.
actor Container: ModelActor {
    nonisolated let modelContainer: ModelContainer
    nonisolated let modelExecutor: ModelExecutor
    static let modelContainer: ModelContainer = {
        do {
            return try ModelContainer(for: Empleados.self)
        } catch {
            fatalError()
        }
    }()
    
    let context: ModelContext
    
    init(container: ModelContainer = Container.modelContainer) {
        self.modelContainer = container
        let context = ModelContext(modelContainer)
        self.modelExecutor = DefaultSerialModelExecutor(modelContext: context)
        self.context = context
        Task {
            do {
                try await loadData()
            } catch {
                print("Error en la carga \(error)")
            }
        }
    }
}
The problem is that, in spite of doing the load inside a Task and that there is no problem, when starting the app it stops responding the UI while loading to the user interactions. Which gives me to understand that actually the task that should be in a background thread is running somehow over the MainActor.
As I have my own API that will provide the information to my app and refresh it at each startup or even send them in Batch when the internet connection is lost and comes back, I don't want the user to be continuously noticing that the app stops because it is performing a heavy process that is not really running in the background.
Tested and compiled on Xcode 15 beta 7.
I made a Feedback for this: FB13038621.
Thanks
Julio César
                    
                  
                
                    
                      After copying and inserting instances I am getting strange duplicate values in arrays before saving.
My models:
@Model
class Car: Identifiable {
    @Attribute(.unique)
    var name: String
    var carData: CarData
    func copy() -> Car {
        Car(
            name: "temporaryNewName",
            carData: carData
        )
    }
}
@Model
class CarData: Identifiable {
    var id: UUID = UUID()
    var featuresA: [Feature]
    var featuresB: [Feature]
   func copy() -> CarData {
       CarData(
            id: UUID(),
            featuresA: featuresA,
            featuresB: featuresB
        )
    }
}
@Model
class Feature: Identifiable {
    @Attribute(.unique) 
    var id: Int
    @Attribute(.unique)
    var name: String
    @Relationship(
        deleteRule:.cascade,
        inverse: \CarData.featuresA
    )
    private(set) var carDatasA: [CarData]?
    @Relationship(
        deleteRule:.cascade,
        inverse: \CarData.featuresB
    )
    private(set) var carDatasB: [CarData]?
}
The Car instances are created and saved to SwiftData, after that in code:
        var fetchDescriptor = FetchDescriptor<Car>(
            predicate: #Predicate<Car> {
                car in
                car.name == name
            }
        )
        let cars = try! modelContext.fetch(
            fetchDescriptor
        )
        let car = cars.first!
        print("car featuresA:", car.featuresA.map{$0.name}) //prints ["green"] - expected
        let newCar = car.copy()
        newCar.name = "Another car"
        newcar.carData = car.carData.copy()
        print("newCar featuresA:", newCar.featuresA.map{$0.name}) //prints ["green"] - expected
        modelContext.insert(newCar)
        print("newCar featuresA:", newCar.featuresA.map{$0.name}) //prints ["green", "green"] - UNEXPECTED!
        
        /*some code planned here modifying newCar.featuresA, but they are wrong here causing issues, 
for example finding first expected green value and removing it will still keep the unexpected duplicate 
(unless iterating over all arrays to delete all unexpected duplicates - not optimal and sloooooow).*/
        try! modelContext.save()
        print("newCar featuresA:", newCar.featuresA.map{$0.name}) //prints ["green"] - self-auto-healed???
Tested on iOS 18.2 simulator and iOS 18.3.1 device. Minimum deployment target: iOS 17.4
The business logic is that new instances need to be created by copying and modifying previously created ones, but I would like to avoid saving before all instances are created, because saving after creating each instance separately takes too much time overall. (In real life scenario there are more than 10K objects with much more properties, updating just ~10 instances with saving takes around 1 minute on iPhone 16 Pro.)
Is this a bug, or how can I modify the code (without workarounds like deleting duplicate values) to not get duplicate values between insert() and save()?
                    
                  
                
                    
                      When I logged into my cloudkit console to inspect the database for some debugging work I couldn't access the private database. It keeps saying "failed to access iCloud data, please signi n again". No matter how many times I sign in again, whether with password or passwordless key it keeps saying the same thing. It says that message when I click on Public database, and private and shared databases are below it. I only noticed this a couple of days ago. It's done this in the past, but I eventually got back into the database but I don't know what changed to make it work.
                    
                  
                
                    
                      I'm currently using Xcode 16 Beta (16A5171c) and I'm getting a crash whenever I attempt to fetch using my ModelContext in my SwiftUI video using the environment I'm getting a crash specifically on iOS 18 simulators.
I've opened up a feedback FB13831520 but it's worth noting that I can run the code I'll explain in detail below on iOS 17+ simulator and devices just fine.
I'm getting the following crash:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The specified URI is not a valid Core Data URI: x-coredata:///MyApp/XXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXX'
It's almost as if on iOS18 SwiftData is unable to find the file on the simulator to perform CRUD operations.
All I'm doing in my project is simply fetching data using the modelContext.
    func contains(_ model: MyModel, in context: ModelContext) -> Bool {
        let objId = palette.persistentModelID
        let fetchDesc = FetchDescriptor<MyModel>(predicate: #Predicate { $0.persistentModelID == objId })
        let itemCount = try? context.fetchCount(fetchDesc)
        return itemCount != 0
    }
                    
                  
                
                    
                      I've been testing out SwiftData but haven't bee able to get ModelContext notifications working. I've tried both an objc observer and for await patterns but it never fires. If I listen for the older nsmanagedcontext notifications they are firing, but I am hoping that the new ones give an ID instead of an objectId. Has anyone got these working?
Attempt 1:
class NotificationObserver {
    init() {
        let didSaveNotification = ModelContext.didSave
        NotificationCenter.default.addObserver(self, selector: #selector(didSave(_:)),
                                               name: didSaveNotification, object: nil)
    }
    @objc func didSave(_ notification: Notification) {
        print(notification.name)
    }
}
Attempt 2:
class NotificationObserver {
    init() {
        let didSaveNotification = ModelContext.didSave
        Task {
            for await note in NotificationCenter.default.notifications(named: didSaveNotification) {
                print(note)
            }
        }
    }    
}
                    
                  
                
                    
                      I am trying to port my application over to CloudKit.  My app worked fine before, but then I made scheme of changes and am trying to deploy to a new container.  For some reason, the database is not being created after I create the container through Xcode.
I think I have configured the app correctly and a container was created, but no records were deployed. My app current stores data locally on individual devices just fine but they don't sync with each other. That's why I would like to use CloudKit.
See screenshot from Xcode of where I have configured the container. I also have background notifications enabled.  Also see screenshot from console where the container has been created, but no records have been.
Any suggestions would be greatly appreciated.
Thank you
                    
                  
                
                    
                      Hi,
I have a mac os app that I am developing. It is backed by a SwiftData database. I'm trying to set up cloudkit so that the app's data can be shared across the user's devices. However, I'm finding that every tutorial i find online makes it sound super easy, but only discusses it from the perspective of ios.
The instructions typically say:
Add the iCloud capability.
Select CloudKit from its options.
Press + to add a new CloudKit container, or select one of your existing ones.
Add the Background Modes capability.
Check the box "Remote Notifications" checkbox from its options.
I'm having issue with the following:
I don't see background modes showing up or remote notifications checkbox since i'm making a mac os app.
If i do the first 3 steps only, when i launch my app i get an app crash while trying to load the persistent store. Here is the exact error message:
Add the iCloud capability.
Select CloudKit from its options.
Press + to add a new CloudKit container, or select one of your existing ones.
Add the Background Modes capability.
Check the box "Remote Notifications" checkbox from its options.
Any help would be greatly appreciated.
 var sharedModelContainer: ModelContainer = {
        let schema = Schema([One.self, Two.self])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()
The fatal error in the catch block happens when i run the app.
                    
                  
                
                    
                      public static func fetch(in context: NSManagedObjectContext,                           configurationBlock: (NSFetchRequest) -&gt; () = { _ in })  -&gt; [Self] {
let request = NSFetchRequest(entityName: Self.entityName)
configurationBlock(request)
    return try! context.fetch(request) 
}
context.fetch(request),  'fetch' function  has error.   Thread 24: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
                Tags:
              
              
  
  
    
      
      
      
        
          
            Xcode Sanitizers and Runtime Issues
          
        
        
      
      
    
      
      
      
        
          
            Core Data
          
        
        
      
      
    
  
  
              
                
                
              
            
          
                    
                      Swift recently added support for Int128.  However, they do need NOT seem to be supported in SwiftData. Now totally possible I'm doing something wrong too.
I have the project set to macOS 15 to use a UInt128 in @Model class as attribute.  I tried using a clean Xcode project with Swift Data choosen in the macOS app wizard.
Everything compiles, but it fails at runtime in both my app and "Xcode default" SwiftData:
SwiftData/SchemaProperty.swift:380: Fatal error: Unexpected property within Persisted Struct/Enum: Builtin.Int128
with the only modification to from stock is:
@Model
final class Item {
    var timestamp: Date
    var ipv6: UInt128
    
    init(timestamp: Date) {
        self.timestamp = timestamp
        self.ipv6 = 0
    }
}
I have tried both Int128 and UInt128.  Both fails exactly the same. In fact, so exactly, when using UInt128 it still show a "Int128" in error message, despite class member being UInt128 .
My underlying need is to store an IPv6 addresses with an app, so the newer UInt128 would work to persist it.  Since Network Framework IPv6Address is also not compatible, it seems, with SwiftData.  So not a lot of good options, other an a String.  But for an IPv6 address that suffers from that same address can take a few String forms (i.e. "0000:0000:0000:0000:0000:0000:0000:0000" =="0:0:0:0:0:0:0:0" == "::") which is more annoying than having a few expand Int128 as String separator ":".
Ideas welcomed.  But potentially a bug in SwiftData since Int128 is both a Builtin and conforms to Codable, so from my reading it should work.
                    
                  
                
                    
                      My app has been in the App Store a few months. In that time I've added a few updates to my SwiftData schema using a MigrationPlan, and things were seemingly going ok. But then I decided to add CloudKit syncing. I needed to modify my models to be compatible. So, I added another migration stage for it, changed the properties as needed (making things optional or adding default values, etc.). In my tests, everything seemed to work smoothly updating from the previous version to the new version with CloudKit. So I released it to my users. But, that's when I started to see the crashes and error reports come in. I think I've narrowed it down to when users update from older versions of the app. I was finally able to reproduce this on my end, and Core Data is throwing an error when loading the ModelContainer saying "CloudKit integration requires that all attributes be optional, or have a default value set." Even though I did this in the latest schema. It’s like it’s trying to load CloudKit before performing the schema migration, and since it can’t, it just fails and won’t load anything. I’m kinda at a loss how to recover from this for these users other than tell them to delete their app and restart, but obviously they’ll lose their data that way. The only other idea I have is to setup some older builds on TestFlight and direct them to update to those first, then update to the newest production version and hope that solves it. Any other ideas? And what can I do to prevent this for future users who maybe reinstall the app from an older version too? There's nothing special about my code for loading the ModelContainer. Just a basic:
let container = try ModelContainer(
    for: Foo.self, Bar.self,
    migrationPlan: SchemaMigration.self,
    configurations: ModelConfiguration(cloudKitDatabase: .automatic)
)
                    
                  
                
                    
                      I am trying to migrate my Core Data model to a new version with a new attribute added to it. Since my app supports macOS 13 I am not able to use the newly introduced Staged migrations.
After much digging I found that the app is not able to find the Mapping Model when one of the attribute has "Preserve after deletion" enabled.
I have enabled migration debbuging using
com.apple.CoreData.MigrationDebug 1
I am getting following error
error: CoreData: error: (migration) migration failed with error Error Domain=NSCocoaErrorDomain Code=134140 "Persistent store migration failed, missing mapping model."
What is the way out here?
                    
                  
                
                    
                      I have some models in my app:
[SDPlanBrief.self, SDAirport.self, SDChart.self, SDIndividualRunwayAirport.self, SDLocationBrief.self]
SDLocationBrief has a @Relationship with SDChart
When I went live with my app I didn't have a versioned schema, but quickly had to change that as I needed to add items to my SDPlanBrief Model.
The first versioned schema I made included only the model that I had made a change to.
static var models: [any PersistentModel.Type] {
        [SDPlanBrief.self]
    }
I had made zero changes to my model container and the whole time, and it was working fine. The migration worked well and this is what I was using:
.modelContainer(for: [SDAirport.self, SDIndividualRunwayAirport.self, SDLocationBrief.self, SDChart.self, SDPlanBrief.self])
I then saw that to do this all properly, I should actually include ALL of my @Models in the versioned schema:
enum AllSwiftDataSchemaV3: VersionedSchema {
    
    static var models: [any PersistentModel.Type] {
        [SDPlanBrief.self, SDAirport.self, SDChart.self, SDIndividualRunwayAirport.self, SDLocationBrief.self]
    }
    static var versionIdentifier: Schema.Version = .init(2, 0, 0)
}
extension AllSwiftDataSchemaV3 {
    
    @Model
    class SDPlanBrief {
        var destination: String
        etc...
        
        init(destination: String, etc...) {
            self.destination = destination
            etc...
        }
    }
    
    @Model
    class SDAirport {
        var catABMinima: String
        etc...
        
        init(catABMinima: String etc...) {
            self.catABMinima = catABMinima
            etc...
        }
    }
    
    @Model
    class SDChart: Identifiable {
        var key: String
        etc...
        var brief: SDLocationBrief?  // @Relationship with SDChart
        
        init(key: String etc...) {
            self.key = key
            etc...
        }
    }
    
    @Model
    class SDIndividualRunwayAirport {
        var icaoCode: String
        etc...
        
        init(icaoCode: String etc...) {
            self.icaoCode = icaoCode
            etc...
        }
    }
    
    @Model
    class SDLocationBrief: Identifiable {
        var briefString: String
        etc...
        @Relationship(deleteRule: .cascade, inverse: \SDChart.brief) var chartsArray = [SDChart]()
        init(
            briefString: String,
            etc...
            chartsArray: [SDChart] = []
        ) {
            self.briefString = briefString
            etc...
            self.chartsArray = chartsArray
        }
    }
}
This is ALL my models in here btw.
I saw also that modelContainer needed updating to work better for versioned schemas. I changed my modelContainer to look like this:
actor ModelContainerActor {
    
    @MainActor
    static func container() -> ModelContainer {
        let schema = Schema(
            versionedSchema: AllSwiftDataSchemaV3.self
        )
        let configuration = ModelConfiguration()
        let container = try! ModelContainer(
            for: schema,
            migrationPlan: PlanBriefMigrationPlan.self,
            configurations: configuration
        )
        return container
    }
}
and I am passing in like so:
.modelContainer(ModelContainerActor.container())
Each time I run the app now, I suddenly get this message a few times in a row:
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.
I typealias all of these models too for the most recent V3 version eg:
typealias SDPlanBrief = AllSwiftDataSchemaV3.SDPlanBrief
Can someone see if I am doing something wrong here? It seems my TestFlight users are experiencing a crash every now and then when certain views load (I assume when accessing @Query objects). Seems its more so when a view loads quickly, like when removing a subscription view where the data may not have had time to load??? Can someone please have a look and help me out.
                    
                  
                
                    
                      While experimenting with CloudKit dashboard, I accidentally turned off a iCloud container.
Now in the Certificates, Identifiers & Profiles section of developer portal, this iCloud container identifier is listed under "hidden" not "active"
I can edit its name but there is not way to unhide or active it again.
What am I missing?
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
              
  
  
    
    
  
  
              
                
                
              
            
          
                    
                      I am implementing a custom migration, and facing an issue while implementing a WAL checkpointing.
Here is the code for WAL checkpointing
func forceWALCheckpointingForStore(at storeURL: URL, model: NSManagedObjectModel) throws {
	let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
	let options = [NSSQLitePragmasOption: ["journal_mode": "DELETE"]]
	let store = try persistentStoreCoordinator.addPersistentStore(type: .sqlite, at: storeURL, options: options)
	try persistentStoreCoordinator.remove(store)
}
When the coordinator tries to  add the store I am getting the following error
fault: Store opened without NSPersistentHistoryTrackingKey but previously had been opened with NSPersistentHistoryTrackingKey - Forcing into Read Only mode store
My questions are
Is it really necessary to force WAL checkpointing before migration? I am expecting NSMigrationManager to handle it internally. I am assuming this because the migrateStore function asks for the sourceType where I am passing StoreType.sqlite
If checkpointing is required, then how do I address the original issue
Note:
Since my app supports macOS 13, I am not able to use the newly introduced Staged migrations.
There is similar question on Stackoverflow that remains unanswered. https://stackoverflow.com/q/69131577/1311902
                    
                  
                
                    
                      In my app, I've been using ModelActors in SwiftData, and using actors with a custom executor in Core Data to create concurrency safe services.
I have multiple actor services that relate to different data model components or features, each that have their own internally managed state (DocumentService, ImportService, etc).
The problem I've ran into, is that I need to be able to use multiple of these services within another service, and those services need to share the same context. Swift 6 doesn't allow passing contexts across actors.
The specific problem I have is that I need a master service that makes multiple unrelated changes without saving them to the main context until approved by the user.
I've tried to find a solution in SwiftData and Core Data, but both have the same problem which is contexts are not sendable. Read the comments in the code to see the issue:
/// This actor does multiple things without saving, until committed in SwiftData.
@ModelActor
actor DatabaseHelper {
    func commitChange() throws {
        try modelContext.save()
    }
    
    func makeChanges() async throws {
        // Do unrelated expensive tasks on the child context...
        
        // Next, use our item service
        let service = ItemService(modelContainer: SwiftDataStack.shared.container)
        let id = try await service.expensiveBackgroundTask(saveChanges: false)
        
        // Now that we've used the service, we need to access something the service created.
        // However, because the service created its own context and it was never saved, we can't access it.
       let itemFromService = context.fetch(id) // fails
        
        // We need to be able to access changes made from the service within this service, 
        /// so instead I tried to create the service by passing the current service context, however that results in:
        // ERROR: Sending 'self.modelContext' risks causing data races
        let serviceFromContext = ItemService(context: modelContext)
        
        // Swift Data doesn't let you create child contexts, so the same context must be used in order to change data without saving. 
    }
}
@ModelActor
actor ItemService {
    init(context: ModelContext) {
        modelContainer = SwiftDataStack.shared.container
        modelExecutor = DefaultSerialModelExecutor(modelContext: context)
    }
    
    func expensiveBackgroundTask(saveChanges: Bool = true) async throws -> PersistentIdentifier? {
        // Do something expensive...
        return nil
    }
}
Core Data has the same problem:
/// This actor does multiple things without saving, until committed in Core Data.
actor CoreDataHelper {
    let parentContext: NSManagedObjectContext
    let context: NSManagedObjectContext
    
    /// In Core Data, I can create a child context from a background context.
    /// This lets you modify the context and save it without updating the main context.
    init(progress: Progress = Progress()) {
        parentContext = CoreDataStack.shared.newBackgroundContext()
        let childContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        childContext.parent = parentContext
        self.context = childContext
    }
    
    /// To commit changes, save the parent context pushing them to the main context.
    func commitChange() async throws {
        // ERROR: Sending 'self.parentContext' risks causing data races
        try await parentContext.perform {
            try self.parentContext.save()
        }
    }
    func makeChanges() async throws {
        // Do unrelated expensive tasks on the child context...
        // As with the Swift Data example, I am unable to create a service that uses the current actors context from here.
        // ERROR: Sending 'self.context' risks causing data races
        let service = ItemService(context: self.context)
    }
}
Am I going about this wrong, or is there a solution to fix these errors?
Some services are very large and have their own internal state. So it would be very difficult to merge all of them into a single service. I also am using Core Data, and SwiftData extensively so I need a solution for both.
I seem to have trapped myself into a corner trying to make everything concurrency save, so any help would be appreciated!