如何根据Realm中的某些属性更新领域对象?

时间:2018-11-28 10:36:57

标签: ios swift realm

我的Realm数据库中有这样的产品 enter image description here

我想基于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中的某些属性更新领域对象?

3 个答案:

答案 0 :(得分:2)

您应该使用Realm自己的filter方法,该方法接受NSPredicate并在操作时返回自动更新的Results实例,而不是Swift的filterRealm个收藏夹上。比要么更新获取的产品的属性,要么创建一个新产品并将其保存到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
    }
}

如果您希望Product基于它们的productID属性是唯一的,则还可以将productID设置为primaryKey子类的Object

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

答案 1 :(得分:0)

尝试一下-

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
}

答案 2 :(得分:0)

当在插入功能内将数据插入数据库时​​,将update键标记为true,然后尝试更新该值。例如:

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

希望这对您有所帮助。