【问题标题】:how to update realm object based on the certain property in Realm?如何根据领域中的特定属性更新领域对象?
【发布时间】:2018-11-29 09:50:23
【问题描述】:

我的 Realm 数据库中有这样的产品

我想根据 productID 更新我的领域数据库,所以我不需要一遍又一遍地添加另一个产品。假设 我想将 productID = "a" 的产品数量更新为 5

我尝试过写这样的东西。

        let selectedProductID = "a"
        let productsInRealmDatabase = realm.objects(Product.self)
        let productIndex = productsInRealmDatabase.index(where: {$0.productID == selectedProductID})
        
        if let productIndex = productIndex {
        
        do {
            
            try realm.write {
                var productRealm = productsInRealmDatabase[productIndex]
                productRealm.quantity = 5
                productsInRealmDatabase[productIndex] = productRealm // ERROR HERE
            }
            
        } catch {
            // error Handling
        }
        
        
    }

但我收到错误:productsInRealmDatabase[productIndex] = productRealm

错误信息:无法通过下标进行赋值:下标只能获取

那么如何根据 Realm 中的某个属性来更新领域对象呢?

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    您应该使用Realm 自己的filter 方法,该方法接受NSPredicate 并返回自动更新的Results 实例,而不是在对Realm 集合进行操作时使用Swift 的filter。要么更新获取的产品的属性,要么创建一个新产品并将其保存到Realm

    let selectedProductID = "a"
    let productsInRealmDatabase = realm.objects(Product.self)
    let matchingProduct = productsInRealmDatabase.filter("productID == %@", selectedProductID).first
    
    if let matchingProduct = matchingProduct {
        do {
            try realm.write {
                matchingProduct.quantity = 5
            }
        } catch {
            // error Handling
        }
    } else {
        let newProduct = Product()
        newProduct.productID = selectedProductID
        newProduct.quantity = 5
        do {
            try realm.write {
                realm.add(newProduct)
            }
        } catch {
            // error Handling
        }
    }
    

    如果您希望您的Products 基于其productID 属性是唯一的,您还可以使用将productID 设置为primaryKeyObject 子类。

    class Product:Object {
        @objc dynamic var productID = ""
        ...
        override static func primaryKey() -> String? {
            return "productID"
        }
    }
    

    【讨论】:

    • 旁注:如果不是"productID == %@"它是"\(#keyPath(Product.productID)) = %@",它将对未来的应用程序支持略有帮助。
    • 先生,能否请您再帮我一次?也许你知道答案。提前感谢stackoverflow.com/questions/53790612/…
    【解决方案2】:

    试试这个 -

    let selectedProductID = "a"
    let productsInRealmDatabase = realm.objects(Product.self)
    let filteredProducts = productsInRealmDatabase.filter("productID = \(selectedProductID)")
    
    do {
        try realm.write {
            filteredProducts.forEach { product in
                product.quantity = 5
            }
        }
    } catch {
        // error Handling
    }
    

    【讨论】:

      【解决方案3】:

      在插入函数内将数据插入数据库时​​,将更新键标记为真,然后尝试更新值。例如:

         static func insertData() {
      
              //Your insertion code//
               try! realm.write {
                      realm.add(request, update:  true)
                  }
         }
      
      
         static func updateData(productId: String, quantity: Int) {
      
          let product = self.getProductData(prodId: productId)
          let realm = try! Realm()
          try! realm.write {
              product?.quantity = quantity
          }
      }
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多