如何根据另一行的更改来更新一行?

时间:2019-05-11 03:09:29

标签: android sqlite android-sqlite android-room

说我有两个表来跟踪一个银行帐户:

Account:
------------------------------
AccountID| Account Value
------------------------------
| 0      | 1000

Transactions:
------------------------------------------------
TransactionID| Transaction Value| Paying Account
-------------------------------------------------    
| 23         | -50.0            | 0
--------------------------------------------------
| 24         | -5               | 0

TransactionID = 24有一个更新,新值是-10。 更新帐户价值以反映此更改的最佳方法是什么?

我在代码中所做的是

  1. 有人在编辑对话框中单击“确定”后
  2. 通过添加负值来冲销原始交易:
  3. 然后将新的交易值应用于该帐户

    AccountDAO acc = mDatabase.AccountDAO().getAccount(0);
    acc.account_value += transaction_id_24.value * -1;
    acc.account_value += transaction_id_24_updated.value;
    mDatabase.AccountDAO().updateAccount(acc);
    

    上述方法有效,但是我觉得上面有一种更好的自动化方法。

数据库是否可以通过任何方式自动检测到交易金额已更改,然后更新sqlite / android-room中的相应帐户?

2 个答案:

答案 0 :(得分:1)

Room内置了您所需的所有工具:

  

在房间中使用LiveData

     

Room持久性库支持可观察的查询,这些查询返回LiveData对象。可观察到的查询是作为数据库访问对象(DAO)的一部分编写的。

     

更新数据库时,Room生成所有必需的代码来更新LiveData对象。需要时,生成的代码在后台线程上异步运行查询。此模式对于使UI中显示的数据与数据库中存储的数据保持同步非常有用。您可以在《 Room持久性库指南》中阅读有关Room和DAO的更多信息。

只需观察您在Room中的@Query返回的LiveData,即可对返回的结果执行其他逻辑。

答案 1 :(得分:1)

这是触发器的典型用例。 希望这个例子有帮助。

var meshes = new THREE.Group();
var mesh1 = new THREE.Mesh( geometry, material );
var mesh2 = new THREE.Mesh( geometry, material );
var mesh3 = new THREE.Mesh( geometry, material );
meshes.add( mesh1 );
meshes.add( mesh2 );
meshes.add( mesh3 );
scene.add( meshes );