Query sul record dati di base di Cloud Kit

Sep 03 2020

Ho un'app su cui sto tentando di migrare utilizzando CloudKit per archiviare i dati principali in modo che possano essere sincronizzati su tutti i dispositivi.

La sincronizzazione funziona correttamente, il problema che sto riscontrando è che l'app aggiunge alcuni dati iniziali al database, questo ne causa la duplicazione quando viene installata su un altro dispositivo. Attualmente sto usando i valori predefiniti dell'utente per memorizzare un bool localmente se è stata eseguita la prima esecuzione, che ovviamente funziona solo per dispositivo

C'è un modo per vedere se i dati esistono già nel cloud e impedire l'aggiunta dei dati iniziali.

La documentazione di Apple suggerisce che è possibile se un oggetto esiste già, ma al primo avvio non ci sono oggetti nel negozio locale. https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

Risposte

1 SteveB Sep 04 2020 at 15:00

Supponendo che entrambi i dispositivi stiano utilizzando lo stesso accesso CloudKit, se i dati che desideri controllare sono archiviati nel record utente, puoi farlo:

  1. Prendi l'ID CloudKit per quell'utente
func iCloudUserIDAsync(complete: @escaping (_ instance: CKRecord.ID?, _ error: NSError?) -> ()) {
        let container = CKContainer.default()
        container.fetchUserRecordID() {
            recordID, error in
            
            if let error = error {
               //handle
            } else {
                self.userRecordID = recordID
                complete(recordID, nil)
            }
        }
    }
  1. Quindi usa quell'ID per interrogare CloudKit e recuperare l'utente:
CKContainer.default().publicCloudDatabase.fetch(withRecordID: userRecordID) { (results, error ) in
     if results != nil {
         //got the user record, do what you want with it
     }
     if let error = error {
         //handle error
     }
}

In alternativa, se i tuoi dati non sono nel record utente, ti consigliamo di eseguire una query utilizzando CKQueryOperation e predicati: buon tutorial qui: https://www.raywenderlich.com/4878052-cloudkit-tutorial-getting-started