我有两个模型类,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中一样
基本上,对象需要具有主键来更新数据库中的现有对象