web-dev-qa-db-fra.com

Swift Supprimer un objet du royaume

J'ai un objet de domaine qui enregistre la liste de la réponse JSON. Mais maintenant, je dois supprimer l'objet si l'objet n'est pas à nouveau sur la liste de JSON. Comment je fais ça? Ceci est mon init pour le royaume

func listItems (dic : Array<[String:AnyObject]>) -> Array<Items> {
        let items : NSMutableArray = NSMutableArray()
        let realm = try! Realm()
        for itemDic in dic {
            let item = Items.init(item: itemDic)
                try! realm.write {
                    realm.add(item, update: true)
                }
            items.addObject(item)
        }
        return NSArray(items) as! Array<Items>
}
11
Voyager

imaginez que votre objet Items possède une propriété id et que vous souhaitez supprimer les anciennes valeurs non incluses dans le nouvel ensemble, soit vous pouvez tout supprimer avec juste

let result = realm.objects(Items.self)
realm.delete(result)

puis ajoutez à nouveau tous les éléments au domaine, ou vous pouvez également interroger chaque élément non inclus dans le nouvel ensemble

let items = [Items]() // fill in your items values
// then just grab the ids of the items with
let ids = items.map { $0.id }

// query all objects where the id in not included
let objectsToDelete = realm.objects(Items.self).filter("NOT id IN %@", ids)

// and then just remove the set with
realm.delete(objectsToDelete)
24
fel1xw

J'obtiendrai une erreur de plantage si je supprime comme la réponse de vote supérieur.

Terminating app due to uncaught exception 'RLMException', reason: 'Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first.'

Supprimer dans une transaction d'écriture:

let items = realm.objects(Items.self)
try! realm!.write {
    realm!.delete(items)
}
5
William Hu

Ce que vous pouvez faire est d'attribuer une clé primaire à l'objet que vous insérez, et lorsque vous recevez un nouveau JSON analysé, vous vérifiez si cette clé existe déjà ou non avant de l'ajouter.

class Items: Object {
    dynamic var id = 0
    dynamic var name = ""

    override class func primaryKey() -> String {
        return "id"
    }
}

Lors de l'insertion de nouveaux objets, interrogez d'abord la base de données du domaine pour vérifier si elle existe.

let repeatedItem = realm.objects(Items.self).filter("id = 'newId'")

if !repeatedItem {
   // Insert it
}
4
Diogo Antunes

La première suggestion qui vous vient à l'esprit est de supprimer tous les objets avant d'insérer de nouveaux objets dans JSON.

En savoir plus sur la suppression d'objets dans Realm sur https://realm.io/docs/Swift/latest/#deleting-objects

3
Dmitry
func realmDeleteAllClassObjects() {
    do {
        let realm = try Realm()

        let objects = realm.objects(SomeClass.self)

        try! realm.write {
            realm.delete(objects)
        }
    } catch let error as NSError {
        // handle error
        print("error - \(error.localizedDescription)")
    }
}

// si vous souhaitez supprimer un objet

func realmDelete(code: String) {

    do {
        let realm = try Realm()

        let object = realm.objects(SomeClass.self).filter("code = %@", code).first

        try! realm.write {
            if let obj = object {
                realm.delete(obj)
            }
        }
    } catch let error as NSError {
        // handle error
        print("error - \(error.localizedDescription)")
    }
}
2
BatyrCan