我有两个模型类,Product和StoreTransaction,如下所示

产品.kt

open class Product(
    var barcode: String? = null,
    var name: String? = null,
    var price: Double? = null,
    var quantity: Double? = null
) : RealmObject()


StoreTransaction.kt

open class StoreTransaction(
    var date: Date? = null,
    var productList: RealmList<Product>? = null
    // and other variables below
) : RealmObject()


在这里,我们有3个产品,产品A,B和C,每个数量相同,数量为5个

然后我分别购买产品A和C 2件,并保存这样的交易

fun saveTransaction(toBuyList: ArrayList<Product>, realm: Realm) {
        val date = Date()
        val productList = RealmList<Product>()
        productList.addAll(toBuyList.toList())

        // other variables

        val st = StoreTransaction(date, productList // other vars)

        realm.executeTransaction {
            realm.copyToRealm(st)

            // update stock quantity
            toBuyList.forEach { itemToBuy ->
                val product = realm.where(Product::class.java)
                    .equalTo("barcode", itemToBuy.barcode).findFirst()
                product?.quantity = product?.quantity?.minus(itemToBuy.quantity!!)
            }
        }
    }


当我查询我的产品时,我得到以下结果


产品A:3.0
产品A:2.0
产品B:5.0
产品C:3.0
产品C:2.0


似乎将产品RealmList保存在StoreTransaction类中会在Product类中创建新数据。有办法防止这种情况吗?我试图不显示出售的产品。

现在,我知道我可以在Product类中创建一个额外的变量,例如一个布尔值,指示是否出售了该产品,然后对其进行查询。但这是正确的方法吗?

旁注:目前,我当前的解决方案是将StoreTransaction中的productList属性更改为字符串(通过使用Gson)作为临时字符串。它运行良好且很好,但是如果有更好的方法来解决这个问题,我会好奇的。

最佳答案

在条形码上使用@PrimaryKey注释

public class TestObj extends RealmObject {
    @PrimaryKey
    private String code;
}


就像我在Java中一样
基本上,对象需要具有主键来更新数据库中的现有对象

10-06 13:03