web-dev-qa-db-ja.com

Swiftオブジェクトをレルムから削除

JSON応答からリストを保存するレルムオブジェクトがあります。しかし、オブジェクトがJSONから再びリストにない場合、オブジェクトを削除する必要があります。どうやってやるの?これはレルムの私の初期設定です

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

Itemsオブジェクトにidプロパティがあり、新しいセットに含まれていない古い値を削除することを想像してください。

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

その後、すべてのアイテムを再びレルムに追加します。または、新しいセットに含まれていないすべてのアイテムをクエリすることもできます

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

トップ投票の回答のように削除すると、クラッシュエラーが発生します。

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.'

書き込みトランザクションで削除します。

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

できることは、挿入するオブジェクトに主キーを割り当てることです。新しい解析済みJSONを受信する場合、追加する前にそのキーが既に存在するかどうかを確認します。

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

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

新しいオブジェクトを挿入する場合、最初にRealmデータベースを照会して、存在するかどうかを確認します。

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

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

頭に浮かぶ最初の提案は、JSONから新しいオブジェクトを挿入する前にすべてのオブジェクトを削除することです。

https://realm.io/docs/Swift/latest/#deleting-objects でRealmのオブジェクトの削除の詳細をご覧ください

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)")
    }
}

// 1つのオブジェクトを削除する場合

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