Как обновить объект области на основе определенного свойства в области? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть продукты в моей базе данных 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

Сообщение об ошибке: Невозможно назначить через индекс: индекс только для получения

, так как обновитьобъект области, основанный на определенном свойстве в области?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы должны использовать Realm собственный метод filter, который принимает NSPredicate и возвращает автоматически обновляемый экземпляр Results, а не filter Swift при работе с коллекциями Realm.Затем обновите свойства извлеченного продукта или создайте новый и сохраните его в 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"
    }
}
0 голосов
/ 28 ноября 2018

При вставке данных в базу данных внутри функции вставки пометьте ключ обновления как 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
    }
}

Надеюсь, это поможет вам.

0 голосов
/ 28 ноября 2018

Попробуйте это -

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...