【问题标题】:Swift Remove Object from Realm快速从领域中删除对象
【发布时间】:2023-03-06 18:46:01
【问题描述】:

我有从 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 以了解如何删除...

标签: swift xcode realm


【解决方案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)")
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 2018-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多