Как правильно обновить данные списка массивов в базе данных области в Swift? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть объект области продукта, подобный этому:

class Product : Object {

    @objc dynamic var productID : String = ""
    @objc dynamic var name : String = ""
    @objc dynamic var unitPrice: Double = 0.0
    @objc dynamic var quantity = 0
    @objc dynamic var descriptionProduct : String = ""
    @objc dynamic var hasBeenAddedToWishList : Bool = false
    @objc dynamic var hasBeenAddedToCart : Bool = false
    @objc dynamic var isNewProduct : Bool = false
    var imagePaths = List<String>()

    override static func primaryKey() -> String? {
        return "productID"
    }

    func toDictionary() -> [String:Any] {
        return [
            "productID" : productID,
            "name" : name,
            "unitPrice": unitPrice,
            "quantity": quantity,
            "descriptionProduct": descriptionProduct,
            "hasBeenAddedToWishList": hasBeenAddedToWishList,
            "hasBeenAddedToCart": hasBeenAddedToCart,
            "isNewProduct": isNewProduct,
            "imagePaths": imagePaths
        ]
    }

}

Я хочу обновить данные продукта, используя эту функцию:

 static func updateProductDataInRealmDatabase(oldProductData: Product, newProductData: Product) {

        guard let matchingProduct = RealmService.shared.realm.objects(Product.self).filter("productID == %@", oldProductData.productID).first else {return}

        var newDataProductDictionary = newProductData.toDictionary() // the definition of toDictionary is in above code
        newDataProductDictionary["productID"] = nil   // to avoid updating the primary key

        RealmService.shared.update(object: matchingProduct, for: newDataProductDictionary)

    }

, и вот определение службы области дляобновить данные:

class RealmService {

    private init() {}
    static let shared = RealmService()

    var realm = try! Realm()

    func update<T: Object>(object: T, for dictionary: [String: Any]) {

        do {

            try realm.write {

                for (key,value) in dictionary {
                    object.setValue(value, forKey: key)
                }

            }

        } catch {
            post(error)
        }

    }


}

Я действительно могу обновить некоторые данные, чтобы они были такими, как productName, productPrice etc, но я не могу обновить свойство imagePaths, которое является List<String>

массив всегда будет нулевым после обновления данных, как показано на рисунке ниже, массив imagePaths станет нулевым:

enter image description here

так как правильно обновить данные продукта?особенно, чтобы обновить данные списка в моем объекте области.что здесь пошло не так?Я использую приведенный ниже код для обновления базы данных области:

func update<T: Object>(object: T, for dictionary: [String: Any]) {

        do {

            try realm.write {

                for (key,value) in dictionary {
                    object.setValue(value, forKey: key)
                }

            }

        } catch {
            post(error)
        }

    }

1 Ответ

0 голосов
/ 18 декабря 2018

Поскольку класс Product уже имеет первичный ключ, нет необходимости искать существующий объект области, используя productID.Область добавит новый объект или обновит старый объект с помощью этого запроса, упомянутого ниже.

Вы можете сделать запрос следующим образом.

let realm = try! Realm()

try! realm.write {
realm.add(anyProductObject,update: true)
}
// You can customize this using generics and also use try catch to handle the errors in case you pass the non realm defined class object 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...