快速从领域中删除对象

Posted

技术标签:

【中文标题】快速从领域中删除对象【英文标题】:Swift Remove Object from Realm 【发布时间】:2017-04-19 15:06:16 【问题描述】:

我有从 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>

【问题讨论】:

顺便说一句,我有 item.id 的主键 您可能需要查看realm link 以了解如何删除... 【参考方案1】:

假设您的 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)

【讨论】:

根据realm docs,这应该是NOT id IN %@ 另外,在 realm.write 中执行删除操作。像这样:试试! realm.write realm.delete(objectsToDelete) 不要忘记在写事务块中添加这个删除操作。【参考方案2】:

如果我删除喜欢的最高投票答案,我会收到崩溃错误。

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)

【讨论】:

【参考方案3】:
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)")
    

//如果你想删除一个对象

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

【讨论】:

【参考方案4】:

您可以做的是为您插入的对象分配一个主键,当接收到一个新的解析 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

【讨论】:

【参考方案5】:

想到的第一个建议是在从 JSON 插入新对象之前删除所有对象。

在https://realm.io/docs/swift/latest/#deleting-objects了解有关删除领域中对象的更多信息

【讨论】:

【参考方案6】:
do 
        let realm = try Realm()

        if let obj = realm.objects(Items.self).filter("id = %@", newId).first 

            //Delete must be perform in a write transaction

            try! realm.write 
                 realm.delete(obj)
             
        

     catch let error 
        print("error - \(error.localizedDescription)")
    

【讨论】:

以上是关于快速从领域中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

领域快速通知停止触发

领域对象已被删除或失效

领域链接对象和删除

如何轻松删除领域中的所有对象

删除领域数据库对象,但即使所有对象都为空,领域文件大小也保持不变。并且在时间上变得太大了

如何从 SwiftUI 列表和领域中删除数据