CloudKit + Coredata : contenu dupliqué

Bonjour,

Je souhaite utiliser cloudkit pour synchroniser ma base de données (coredata) entre mes différents appareils. Les nouvelles données sont récupérées via un un webservice.

Le soucis est que cloudkit me duplique chaque ligne de ma base de données au lieu de fusionner. Le probleme est lié au fait que je récupère les données via le webservice + une synchronisation avec le cloud (par exemple pour les favoris,…).

Dans une autre app que j’ai faite dans laquelle je n’utilise pas de webservice, la synchronisation coredata dans le cloud ne pose aucun porbleme.

J’imagine qu’il va falloir que je supprime moi même les données dupliquées ou que je merge, mais je ne sais pas comment faire car la synchronisation cloudkit se fait directement avec coredata.

Pour le webservice j’ai déjà une fonction qui vérifie si un élément existe deja dans coredata

Une idée de comment faire ? cc @mbritto

voici mon bout de code dans la classe coredata :


    lazy var persistentContainer: NSPersistentContainer = {
        //let container = NSPersistentContainer(name: "monAPP") // sans synchro iCloud
        let container = NSPersistentCloudKitContainer(name: "monAPP") //synchro icloud
        
        // add for indexation spotlight //////////////////////////
        guard let description = container.persistentStoreDescriptions.first else {
            fatalError("###\(#function): Failed to retrieve a persistent store description.")
        }
        
        // Enable history tracking and remote notifications.
        description.type = NSSQLiteStoreType
        description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
        description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
        // END indexation spotlight //////////////////////////
        
        
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        
        // add for indexation spotlight //////////////////////////
        spotlightIndexer = newsSpotlightDelegate(forStoreWith: description, coordinator: container.persistentStoreCoordinator)
        self.toggleSpotlightIndexing(enabled: true)
        
        
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy //aussi utile pour la sync icloud
        container.viewContext.automaticallyMergesChangesFromParent = true //aussi utile pour la sync icloud
        do {
            try container.viewContext.setQueryGenerationFrom(.current)
        } catch {
            fatalError("###\(#function): Failed to pin viewContext to the current generation:\(error)")
        }
        // END indexation spotlight //////////////////////////
        
        return container
    }()

merci d’avance

salut! Je n’ai jamais utilisé CloudKit, mais je suppose que si tu veux synchroniser ses données avec celles d’un webservice tier tu dois avoir un système d’id pour reconnaître les données.
Par exemple, si chaque ligne de ta base possède un ID unique (mais qui sera le même dans le webservice et cloudkit) alors tu pourras vérifier que tu n’ajoutes pas une données qui serait déjà présente dedans.

oui j’ai bien un id mais je ne sais pas comment faire sachant que la synchronisation se fait au chargement de coredata.

Du coup j’ai contourné le porbleme en stockant sous forme d’un seul tableau/dictionnaire les id des articles en favoris,… que je synchronise via icloud quand il y a des changements.

1 « J'aime »