I have a very simple CoreData model that has 1 entity and 2 attributes.
This code works fine:
.onChange(of: searchText) { _, text in
evnts.nsPredicate = text.isEmpty ? nil :NSPredicate(format: "eventName CONTAINS %@ " , text )
but I'd like to also search with the same text string for my second attribute (which is a Date). I believe an OR is appropriate for two conditions (find either one). See attempted code below:
evnts.nsPredicate = text.isEmpty ? nil : NSPredicate(format: "(eventName CONTAINS %@) OR (dueDate CONTAINS %i) " , text )
This crashes immediately %@ does the same. Is there a way to accomplish this?
How is SwiftUI not an option below?
                    
                  
                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
                    
                      Hi,
Not sure how to describe my issue best: I am using SwiftData and CloudKit to store my data.
In the past, when I tested my app on different devices, the data would sync between the devices automatically. For whatever reason this has stopped now and the data no longer syncs. No matter what I do, it feels as if all the data is actually stored just locally on each device.
How can I check if the data is actually stored in the cloud and what could be reasons, why its no longer synching between my devices (and yes, I am logged in with the same Apple ID on all devices).
Thanks for any hint!
Max
                    
                  
                
                    
                      I'm trying to convert some data, then save it back to Core Data. Sometimes this works fine without an issue, but occasionally I'll get an error
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
It seems to occur when saving the core data context. I'm having trouble trying to debug it as it doesn't happen on the same object each time and can't reliably recreate the error
Full view code can be found https://pastebin.com/d974V5Si but main functions below
var body: some View {
        VStack {
            // Visual code here
        }
        .onAppear() {
            DispatchQueue.global(qos: .background).async {
                while (getHowManyProjectsToUpdate() > 0) {
                    leftToUpdate = getHowManyProjectsToUpdate()
                    updateLocal()
                }
                if getHowManyProjectsToUpdate() == 0 {
                    while (getNumberOfFilesInDocumentsDirectory() > 0) {
                        deleteImagesFromDocumentsDirectory()
                    }
                    if getNumberOfFilesInDocumentsDirectory() == 0 {
                        DispatchQueue.main.asyncAfter(deadline: .now()) {
                            withAnimation {
                                self.isActive = true
                            }
                        }
                    }
                }
            }
        }
    }
update local function
func updateLocal() {
        autoreleasepool {
            let fetchRequest: NSFetchRequest<Project> = Project.fetchRequest()
            fetchRequest.predicate = NSPredicate(format: "converted = %d", false)
            fetchRequest.fetchLimit = 1
            fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Project.name, ascending: true), NSSortDescriptor(keyPath: \Project.name, ascending: true)]
            
            do {
                let projects = try viewContext.fetch(fetchRequest)
                for project in projects {
                    currentPicNumber = 0
                    currentProjectName = project.name ?? "Error loading project"
                    if let projectMain = project.mainPicture {
                        currentProjectImage = getUIImage(picture: projectMain)
                    }
                    if let pictures = project.pictures {
                        projectPicNumber = pictures.count
                        // Get main image
                        if let projectMain = project.mainPicture {
                            if let imgThumbData = convertImageThumb(picture: projectMain) {
                                project.mainPictureData = imgThumbData
                            }
                        }
                        
                        while (getTotalImagesToConvertForProject(project: project ) > 0) {
                            convertImageBatch(project: project)
                        }
                        
                        project.converted = true
                        saveContext()
                        viewContext.refreshAllObjects()
                    }
                }
            } catch {
                print("Fetch Failed")
            }
        }
    }
convertImageBatch function
func convertImageBatch(project: Project) {
        autoreleasepool {
            let fetchRequestPic: NSFetchRequest<Picture> = Picture.fetchRequest()
            let projectPredicate = NSPredicate(format: "project = %@", project)
            let dataPredicate = NSPredicate(format: "pictureData == NULL")
            
            fetchRequestPic.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [projectPredicate, dataPredicate])
            fetchRequestPic.fetchLimit = 5
            fetchRequestPic.sortDescriptors = [NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: true)]
            
            do {
                let pictures = try viewContext.fetch(fetchRequestPic)
                for picture in pictures {
                    currentPicNumber = currentPicNumber + 1
                    
                    if let imgData = convertImage(picture: picture), let imgThumbData = convertImageThumb(picture: picture) {
                        // Save Converted
                        picture.pictureData = imgData
                        picture.pictureThumbnailData = imgThumbData
                        
                        // Save Image
                        saveContext()
                        viewContext.refreshAllObjects()
                    } else {
                        viewContext.delete(picture)
                        saveContext()
                        viewContext.refreshAllObjects()
                    }
                }
                
            } catch {
                print("Fetch Failed")
            }
        }
    }
And finally saving
    func saveContext() {
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
    }
                    
                  
                
                    
                      Problem
The following code doesn't work:
let predicate = #Predicate<Car> { car in
   car.size == size //This doesn't work
}
Console Error
Query encountered an error: SwiftData.SwiftDataError(_error: SwiftData.SwiftDataError._Error.unsupportedPredicate)
Root cause
Size is an enum, #Predicate works with other type such as String however doesn't work with enum
Enum value is saved however is not filtered by #Predicate
Environment
Xcode: 15.0 (15A240d) - App Store
macOS: 14.0 (23A339) - Release Candidate
Steps to reproduce
Run the app on iOS 17 or macOS Sonoma
Press the Add button
Notice that the list remains empty
Expected behaviour
List should show the newly created small car
Actual behaviour
List remains empty inspite of successfully creating the small car.
Feedback
FB13194334
Code
Size
enum Size: String, Codable {
    case small
    case medium
    case large
}
Car
import SwiftData
@Model
class Car {
    let id: UUID
    let name: String
    let size: Size
    
    init(
        id: UUID,
        name: String,
        size: Size
    ) {
        self.id = id
        self.name = name
        self.size = size
    }
}
ContentView
struct ContentView: View {
    var body: some View {
        NavigationStack {
            CarList(size: .small)
        }
    }
CarList
import SwiftUI
import SwiftData
struct CarList: View {
    let size: Size
    
    @Environment(\.modelContext)
    private var modelContext
    @Query
    private var cars: [Car]
    
    init(size: Size) {
        self.size = size
        let predicate = #Predicate<Car> { car in
            car.size == size //This doesn't work
        }
        _cars = Query(filter: predicate, sort: \.name)
    }
    
    var body: some View {
        List(cars) { car in
            VStack(alignment: .leading) {
                Text(car.name)
                Text("\(car.size.rawValue)")
                Text(car.id.uuidString)
                    .font(.footnote)
            }
        }
        .toolbar {
            Button("Add") {
                createCar()
            }
        }
    }
    
    private func createCar() {
        let name = "aaa"
        let car = Car(
            id: UUID(),
            name: name,
            size: size
        )
        modelContext.insert(car)
    }
}
                    
                  
                
                    
                      Hey there,
I’m feeling pretty desperate at this point, as my most recent update to Xcode 16.1 and the new 18.1 simulators has basically made it impossible for me to work on my apps.
The same app and same code run fine in the 18.0 simulators with the same iCloud account logged in.
I’ve tried multiple simulators with the same results, even on different computers. I’ve also tried logging in repeatedly without any luck. The CloudKit database logs don’t show any errors or suspicious entries. Reinstalling the app on the simulator doesn't help either.
Whenever I launch the application in Xcode, I'm getting:
error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _performSetupRequest:]_block_invoke(1240): <NSCloudKitMirroringDelegate: 0x600003d213b0>: Failed to set up CloudKit integration for store: <NSSQLCore: 0x103f124e0> (URL: file:///Users/kerstenbroich/Library/Developer/CoreSimulator/Devices/57BC78CE-DB2A-4AC0-9D7A-43C386305F56/data/Containers/Data/Application/EFDE9B05-0584-47C5-80AE-F2FF5994860C/Library/Application%20Support/Model.sqlite)
<CKError 0x600000d3dfe0: "Partial Failure" (2/1011); "Failed to modify some record zones"; partial errors: {
	com.apple.coredata.cloudkit.zone:__defaultOwner__ = <CKError 0x600000d7c090: "Internal Error" (1/5000); "Failed user key sync">
}>
error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate recoverFromError:](2310): <NSCloudKitMirroringDelegate: 0x600003d213b0> - Attempting recovery from error: <CKError 0x600000d3dfe0: "Partial Failure" (2/1011); "Failed to modify some record zones"; partial errors: {
	com.apple.coredata.cloudkit.zone:__defaultOwner__ = <CKError 0x600000d7c090: "Internal Error" (1/5000); "Failed user key sync">
}>
error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _recoverFromPartialError:forStore:inMonitor:]_block_invoke(2773): <NSCloudKitMirroringDelegate: 0x600003d213b0>: Found unknown error as part of a partial failure: <CKError 0x600000d7c090: "Internal Error" (1/5000); "Failed user key sync">
error: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _recoverFromPartialError:forStore:inMonitor:](2820): <NSCloudKitMirroringDelegate: 0x600003d213b0>: Error recovery failed because the following fatal errors were found: {
    "<CKRecordZoneID: 0x600000d62340; zoneName=com.apple.coredata.cloudkit.zone, ownerName=__defaultOwner__>" = "<CKError 0x600000d7c090: \"Internal Error\" (1/5000); \"Failed user key sync\">";
}
Any help/ideas would be much appreciated, because I have no clue what to try next.
Thanks a lot!
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
                Tags:
              
              
  
  
    
      
      
      
        
          
            CloudKit
          
        
        
      
      
    
      
      
      
        
          
            Core Data
          
        
        
      
      
    
      
      
      
        
          
            CloudKit Dashboard
          
        
        
      
      
    
      
      
      
        
          
            SwiftData
          
        
        
      
      
    
  
  
              
                
                
              
            
          
                    
                      Hey,
For some reason I see crashes for my iOS app related to CloudKit entitlements.
The crash happens on start up and it says:
"CKException - Application has malformed entitlements. Found value "*" for entitlement com.apple.developer.icloud-services, expected an array of strings"
I have checked my entitlements of the same build on App Store Connect and it shows "com.apple.developer.icloud-services: ( "CloudKit" )"
So I am not sure why users are having this issue. I haven't been able to reproduce it.
Does anyone have any idea why this is happening?
Thanks
                    
                  
                
                    
                      The 'unique' attribute is a really nice feature, BUT. In some of my apps, the unique identifier for an object is a combination of multiple attributes. (Example: a book title is not unique, but a combination of book title and author list is.)
How do I model this with SwiftData? I cannot use @Attribute(.unique) on either the title OR the author list, but I want SwiftData to provide the same "insert or update" logic.
Is this possible?
                    
                  
                
                    
                      Hi all,
In my SwiftUI / SwiftData / Cloudkit app which is a series of lists, I have a model object called Project which contains an array of model objects called subprojects:
final class Project1
{
    var name: String = ""
    
    @Relationship(deleteRule: .cascade, inverse: \Subproject.project) var subprojects : [Subproject]?
    
    init(name: String)
    {
        self.name = name
        self.subprojects = []
    }
}
The user will select a project from a list, which will generate a list of subprojects in another list, and if they select a subproject, it will generate a list categories and if the user selects a category it will generate another list of child objects owned by category and on and on.
This is the pattern in my app, I'm constantly passing arrays of model objects that are the children of other model objects throughout the program, and I need the user to be able to add and remove things from them.
My initial approach was to pass these arrays as bindings so that I'd be able to mutate them. This worked for the most part but there were two problems: it was a lot of custom binding code and when I had to unwrap these bindings using  init?(_ base: Binding<Value?>), my program would crash if one of these arrays became nil (it's some weird quirk of that init that I don't understand at al).
As I'm still learning the framework, I had not realized that the @model macro had automatically made my model objects observable, so I decided to remove the bindings and simply pass the arrays by reference, and while it seems these references will carry the most up to date version of the array, you cannot mutate them unless you have access to the parent and mutate it like such:
project.subcategories?.removeAll { $0 == subcategory }
project.subcategories?.append(subcategory)
This is weirding me out because you can't unwrap subcategories before you try to mutate the array, it has to be done like above. In my code, I like to unwrap all optionals at the moment that I need the values stored in them and if not, I like to post an error to the user. Isn't that the point of optionals? So I don't understand why it's like this and ultimately am wondering if I'm using the correct design pattern for what I'm trying to accomplish or if I'm missing something? Any input would be much appreciated!
Also, I do have a small MRE project if the explanation above wasn't clear enough, but I was unable to paste in here (too long), attach the zip or paste a link to Google Drive. Open to sharing it if anyone can tell me the best way to do so. Thanks!
                    
                  
                
                    
                      Hey there,
Can we bundle our app with our own version of SQLite with extensions that we want. From what I've seen, we aren't allowed to add extensions to the built in IOS SQLite, so would this be the only way to use extensions. I ask this because I want to use the spell fix extension.
I couldn't find a lot of people talking about adding SQLite extensions.
Thank you!
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
              
  
  
    
    
  
  
              
                
                
              
            
          
                    
                      Hi Folks,
starting with iOS18 and using Xcode16, accessing fetchedProperties results in an error. I identified the issue to occur as soon as the initialization of a fetched property with external binary data storage starts.
Console output during debugging:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This expression has evaluation disabled'
*** First throw call stack:
[...]
libc++abi: terminating due to uncaught exception of type NSException
Console output when trying to "print" the item via the contact menu of the debugger:
Printing description of variable:
error: error: Execution was interrupted, reason: internal ObjC exception breakpoint(-6)..
The process has been returned to the state before expression evaluation.
Message from debugger: killed
The identical code works with iOS before iOS 18 (same for iPadOS 18).
Does anyone observed a similar issue and figured out a solution already?
Cheers,
folox
                    
                  
                
                    
                      Some of my customer get the following CloudKit error (I cannot reproduce is myself).
Failed to modify some records (CKErrorDomain:2) 
userInfo: CKErrorDescription:Failed to modify some records CKPartialErrors:{ 
"<CKRecordID: ooo; recordName=ooo, zoneID=ooo:__defaultOwner__>" 
= "<CKError 0x600003809ce0: \"Limit Exceeded\" (27/2023); server message = \"AssetUploadTokenRetrieveRequest request size exceeds limit\"; 
  op = ooo; uuid = ooo; container ID = \"ooo\">"
This is a CKError.limitExeeded error.
I create 200 or less records in a batch operation. So I am below the 400 limit.
Searching the Internet for "AssetUploadTokenRetrieveRequest request size exceeds limit": 0 results
Can anyone give me a hint?
                    
                  
                
                    
                      I'm experiencing a persistent issue with CloudKit sharing in my iOS application. When attempting to present a UICloudSharingController, I receive the error message "Unknown client: ChoreOrganizer" in the console.
App Configuration Details:
App Name: ChoreOrganizer
Bundle ID: com.ProgressByBits.ChoreOrganizer
CloudKit Container ID: iCloud.com.ProgressByBits.ChoreOrganizer
Core Data Model Name: ChoreOrganizer.xcdatamodeld
Core Data Entity: Chore
Error Details:
The error "Unknown client: ChoreOrganizer" occurs when I present the UICloudSharingController
This happens only on the first attempt to share; subsequent attempts during the same app session don't show the error but sharing still doesn't work
All my code executes successfully without errors until UICloudSharingController is presented
Implementation Details:
I'm using NSPersistentCloudKitContainer for Core Data synchronization and UICloudSharingController for sharing. My implementation creates a custom CloudKit zone, saves both a record and a CKShare in that zone, and then presents the sharing controller.
Here's the relevant code:
@MainActor
func presentSharing(from viewController: UIViewController) async throws {
    // Create CloudKit container
    let container = CKContainer(identifier: containerIdentifier)
    let database = container.privateCloudDatabase
    
    // Define custom zone ID
    let zoneID = CKRecordZone.ID(zoneName: "SharedChores", ownerName: CKCurrentUserDefaultName)
    
    do {
        // Check if zone exists, create if necessary
        do {
            _ = try await database.recordZone(for: zoneID)
        } catch {
            let newZone = CKRecordZone(zoneID: zoneID)
            _ = try await database.save(newZone)
        }
        
        // Create record in custom zone
        let recordID = CKRecord.ID(recordName: "SharedChoresRoot", zoneID: zoneID)
        let rootRecord = CKRecord(recordType: "ChoreRoot", recordID: recordID)
        rootRecord["name"] = "Shared Chores Root" as CKRecordValue
        
        // Create share
        let share = CKShare(rootRecord: rootRecord)
        share[CKShare.SystemFieldKey.title] = "Shared Tasks" as CKRecordValue
        
        // Save both record and share in same operation
        let recordsToSave: [CKRecord] = [rootRecord, share]
        _ = try await database.modifyRecords(saving: recordsToSave, deleting: [])
        
        // Present sharing controller
        let sharingController = UICloudSharingController(share: share, container: container)
        sharingController.delegate = shareDelegate
        
        // Configure popover
        if let popover = sharingController.popoverPresentationController {
            popover.sourceView = viewController.view
            popover.sourceRect = CGRect(
                x: viewController.view.bounds.midX,
                y: viewController.view.bounds.midY,
                width: 1, height: 1
            )
            popover.permittedArrowDirections = []
        }
        
        viewController.present(sharingController, animated: true)
    } catch {
        throw error
    }
}
Steps I've already tried:
Verified correct bundle ID and container ID match in all places (code, entitlements file, Developer Portal)
Added NSUbiquitousContainers configuration to Info.plist
Ensured proper entitlements in the app
Created and configured proper provisioning profiles
Tried both default zone and custom zone for sharing
Various ways of saving the record and share (separate operations, same operation)
Cleaned build folder, deleted derived data, reinstalled the app
Tried on both simulator and physical device
Confirmed CloudKit container exists in CloudKit Dashboard with correct schema
Verified iCloud is properly signed in on test devices
Console Output:
1. Starting sharing process
2. Created CKContainer with ID: iCloud.com.ProgressByBits.ChoreOrganizer
3. Using zone: SharedChores
4. Checking if zone exists
5. Zone exists
7. Created record with ID: <CKRecordID: 0x3033ebd80; recordName=SharedChoresRoot, zoneID=SharedChores:__defaultOwner__>
8. Created share with ID: <CKRecordID: 0x3033ea920; recordName=Share-C4701F43-7591-4436-BBF4-6FA8AF3DF532, zoneID=SharedChores:__defaultOwner__>
9. About to save record and share
10. Records saved successfully
11. Creating UICloudSharingController
12. About to present UICloudSharingController
13. UICloudSharingController presented
Unknown client: ChoreOrganizer
Additional Information:
When accessing the CloudKit Dashboard, I can see that data is being properly synced to the cloud, indicating that the basic CloudKit integration is working. The issue appears to be specific to the sharing functionality.
I would greatly appreciate any insights or solutions to resolve this persistent "Unknown client" error. Thank you for your assistance.
                    
                  
                
                    
                      I have a UIKit app where I've adopted SwiftData and I'm struggling with a crash coming in from some of my users. I'm not able to reproduce it myself and as it only happens to a small fraction of my user base, it seems like a race condition of some sort.
This is the assertion message:
SwiftData/DefaultStore.swift:453: Fatal error: API Contract Violation: Editors must register their identifiers before invoking operations on this store SwiftData.DefaultStore: 00CF060A-291A-4E79-BEC3-E6A6B20F345E did not. (ID is unique per crash)
This is the ModelActor that crashes:
@available(iOS 17, *)
@ModelActor
actor ConsumptionDatabaseStorage: ConsumptionSessionStorage {
	struct Error: LocalizedError {
		var errorDescription: String?
	}
	
	private let sortDescriptor = [SortDescriptor(\SDConsumptionSession.startTimeUtc, order: .reverse)]
	
	static func createStorage(userId: String) throws -> ConsumptionDatabaseStorage {		
		guard let appGroupContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: UserDefaults.defaultAppGroupIdentifier) else {
			throw Error(errorDescription: "Invalid app group container ID")
		}
		
		func createModelContainer(databaseUrl: URL) throws -> ModelContainer {
			return try ModelContainer(for: SDConsumptionSession.self, SDPriceSegment.self, configurations: ModelConfiguration(url: databaseUrl))
		}
		
		let databaseUrl = appGroupContainer.appendingPathComponent("\(userId).sqlite")
		do {
			return self.init(modelContainer: try createModelContainer(databaseUrl: databaseUrl))
		} catch {
			// Creating the model storage failed. Remove the database file and try again.
			try? FileManager.default.removeItem(at: databaseUrl)
			return self.init(modelContainer: try createModelContainer(databaseUrl: databaseUrl))
		}
	}
	
	func isStorageEmpty() async -> Bool {
		(try? self.modelContext.fetchCount(FetchDescriptor<SDConsumptionSession>())) ?? 0 == 0 // <-- Crash here!
	}
	
	func sessionsIn(interval: DateInterval) async throws -> [ConsumptionSession] {
		let fetchDescriptor = FetchDescriptor(predicate: #Predicate<SDConsumptionSession> { sdSession in
			if let startDate = sdSession.startTimeUtc {
				return interval.start <= startDate && interval.end > startDate
			} else {
				return false
			}
		}, sortBy: self.sortDescriptor)
		let consumptionSessions = try self.modelContext.fetch(fetchDescriptor) // <-- Crash here!
		return consumptionSessions.map { ConsumptionSession(swiftDataSession: $0) }
	}
	
	func updateSessions(sessions: [ConsumptionSession]) async throws {
		if #unavailable(iOS 18) {
			// Price segments are duplicated if re-inserted so unfortunately we have to delete and reinsert sessions.
			// On iOS 18, this is enforced by the #Unique macro on SDPriceSegment.
			let sessionIds = Set(sessions.map(\.id))
			try self.modelContext.delete(model: SDConsumptionSession.self, where: #Predicate<SDConsumptionSession> {
				sessionIds.contains($0.id)
			})
		}
		for session in sessions {
			self.modelContext.insert(SDConsumptionSession(consumptionSession: session))
		}
		if self.modelContext.hasChanges {
			try self.modelContext.save()
		}
	}
	
	func deleteAllSessions() async {
		if #available(iOS 18, *) {
			try? self.modelContainer.erase()
		} else {
			self.modelContainer.deleteAllData()
		}
	}
}
The actor conforms to this protocol:
protocol ConsumptionSessionStorage {
	func isStorageEmpty() async -> Bool
	func hasCreditCardSessions() async -> Bool
	func sessionsIn(interval: DateInterval) async throws -> [ConsumptionSession]
	func updateSessions(sessions: [ConsumptionSession]) async throws
	func deleteAllSessions() async
}
The crash is coming in from line 30 and 41, in other words, when trying to fetch data from the database. There doesn't seem to be any common trait for the crashes. They occur across iOS versions and device types.
Any idea what might cause this?
                    
                  
                
                    
                      Hi all,
Has anyone stumbled upon the SwiftData equivalent of @SectionedFetchRequest? Is there a way to do it with @Query? I'll keep going through the documentation but if anyone has an answer, it would be much appreciated!!
Thank you.
                    
                  
                
                    
                      I have a simple model that contains a one-to-many relationship to itself to represent a simple tree structure. It is set to cascade deletes so deleting the parent node deletes the children.
Unfortunately I get an error when I try to batch delete. A test demonstrates:
@Model final class TreeNode {   
  var parent: TreeNode?    
  @Relationship(deleteRule: .cascade, inverse: \TreeNode.parent)    
  var children: [TreeNode] = []    
  init(parent: TreeNode? = nil) {        
    self.parent = parent    
  }
}
func testBatchDelete() throws {        
  let config = ModelConfiguration(isStoredInMemoryOnly: true)        
  let container = try ModelContainer(for: TreeNode.self, configurations: config)                
  let context = ModelContext(container)        
  context.autosaveEnabled = false              
  let root = TreeNode()        
  context.insert(root)      
          
  for _ in 0..<10 {           
    let child = TreeNode(parent: root)            
    context.insert(child)        
  }                
  try context.save()   
  // fails if first item doesn't have a nil parent, succeeds otherwise        
  // which row is first is random, so will succeed sometimes        
  try context.delete(model: TreeNode.self)       
}
The error raised is:
CoreData: error: Unhandled opt lock error from executeBatchDeleteRequest Constraint trigger violation: Batch delete failed due to mandatory OTO nullify inverse on TreeNode/parent and userInfo {    
    NSExceptionOmitCallstacks = 1;    
    NSLocalizedFailureReason = "Constraint trigger violation: Batch delete failed due to mandatory OTO nullify inverse on TreeNode/parent";    
    "_NSCoreDataOptimisticLockingFailureConflictsKey" =     (    );
}
Interestingly, if the first record when doing an unsorted query happens to be the parent node, it works correctly, so the above unit test will actually work sometimes.
Now, this can be "solved" by changing the reverse relationship to an optional like so:
    @Relationship(deleteRule: .cascade, inverse: \TreeNode.parent)    
    var children: [TreeNode]?
The above delete will work fine. However, this causes issues with predicates that test counts in children, like for instance deleting only nodes where children is empty for example:
    try context.delete(model: TreeNode.self,                           
                                   where: #Predicate { $0.children?.isEmpty ?? true })
It ends up crashing and dumps a stacktrace to the console with:
An uncaught exception was raised
Keypath containing KVC aggregate where there shouldn't be one; failed to handle children.@count
(the stacktrace is quite long and deep in CoreData's NSSQLGenerator)
Does anyone know how to work around this?
                    
                  
                
                    
                      How does SwiftData work with background operations? CoreData had background context that could be used to avoid UI hang for heavy operations.
Is there an equivalent in SwiftData, and if so, do I have to merge changes or does it save directly to persistent store?
                    
                  
                
                    
                      I'm getting the following error message when executing the rollback method in a modelContext, what could be causing this ?
SwiftData/ModelSnapshot.swift:46: Fatal error: A ModelSnapshot must be initialized with a known-keys dictionary
                    
                  
                
                    
                      I have integrated CloudKit into a CoreData application and am ready to  deploy the schema to production but keep getting an "internal error" when trying to deploy to production or reset my CloudKit environment. I have attached images of what I am seeing including one of the console error. Is there any way to resolve this?
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
                Tags:
              
              
  
  
    
      
      
      
        
          
            CloudKit
          
        
        
      
      
    
      
      
      
        
          
            Cloud and Local Storage
          
        
        
      
      
    
      
      
      
        
          
            CloudKit Dashboard
          
        
        
      
      
    
      
      
      
        
          
            CloudKit Console
          
        
        
      
      
    
  
  
              
                
                
              
            
          
                    
                      Hi,
I have designed an app which needs to reschedule notifications according to the user's calendar at midnight. The function has been implemented successfully via backgroundtask. But since the app has enabled iCloud sync, some users will edit their calendar on their iPad and expect that the notifications will be sent promptly to them on iPhone without launching the app on their iPhone. But the problem is that if they haven't launched the app on their iPhone, iCloud sync won't happen. The notifications on their iPhone haven't been updated and will be sent wrongly. How can I design some codes to let iCloud sync across the devices without launching the app at midnight and then reschedule notifications?
                    
                  
                
                    
                      This simple test fails in my project. Similar code in my application also crashes.
How do I debug the problem?
What project settings are required.  I have added SwiftData as a framework to test (and application) targets?
Thanks,
The problem is with:
modelContext.insert(item)
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
import XCTest
import SwiftData
@Model
class FakeModel {
    var name: String
    init(name: String) { self.name = name }
}
@MainActor
final class FakeModelTests: XCTestCase {
    var modelContext: ModelContext!
    override func setUp() {
        super.setUp()
        do {
            let container = try ModelContainer(for: FakeModel.self, configurations: ModelConfiguration(isStoredInMemoryOnly: true))
            modelContext = container.mainContext
        } catch {
            XCTFail("Failed to create ModelContainer: \(error)")
            modelContext = nil
        }
    }
    func testSaveFetchDeleteFakeItem() {
        guard let modelContext = modelContext else {
            XCTFail("ModelContext must be initialized")
            return
        }
        
        let item = FakeModel(name: "Test")
       modelContext.insert(item)
        let fetchDescriptor = FetchDescriptor<FakeModel>()
        let items = try! modelContext.fetch(fetchDescriptor)
        XCTAssertEqual(items.count, 1)
        XCTAssertEqual(items.first?.name, "Test")
        modelContext.delete(item)
        let itemsAfterDelete = try! modelContext.fetch(fetchDescriptor)
        XCTAssertEqual(itemsAfterDelete.count, 0)
    }
}