首页 > 解决方案 > 防止在 RealmList 中保存时创建领域对象

问题描述

我有两个模型类,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!!)
            }
        }
    }

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

  1. 产品 A : 3.0
  2. 产品 A : 2.0
  3. 产品 B : 5.0
  4. 产品 C : 3.0
  5. 产品 C : 2.0

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

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

旁注:我目前的解决方案是将 StoreTransaction 中的 productList 属性更改为临时字符串(通过使用 Gson)。它工作得很好,但我很好奇是否有更好的方法来处理这个问题。

标签: javaandroidkotlinrealmrealm-list

解决方案


在条形码上使用 @PrimaryKey 注释

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

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


推荐阅读