首页 > 解决方案 > Room:如何获取成员的实际余额并将其用于setter方法来设置特定成员的余额

问题描述

我使用 Android Room 作为我的数据库。我有一个标题屏幕,当我点击那里的按钮时,我的活动就会打开。该活动向我显示了保存在数据库中的成员列表。我的实体成员由名字、姓氏和余额组成。我可以添加新成员。用户可以设置名字和姓氏,余额自动设置为 0。我确实有另一个实体称为交易,我可以在其中添加交易并将交易与成员联系起来。

如果我为成员 a 添加两个新交易,则成员 a 的余额会增加。我可以在我的会员活动中单击一个会员,然后我会看到该会员的其他信息。在那里,我可以通过我的 DAO 中的 SUM() 查询看到他的实际余额。

但我不知道,如何使用该查询来设置成员的余额。我也不知道应该在哪里(在哪个类中)使用成员类的 set Balance 方法。

有人可以帮我吗?如果您需要任何特定代码,只需写在评论中,我会将其添加到此问题中。谢谢!

实体成员:

@TypeConverters(Converters.class)
@Entity(tableName = "member_table")
public class Member {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "MemberID")
    private long id;

    @ColumnInfo(name = "FirstName")
    private String firstname;

    @ColumnInfo(name = "Surname")
    private String surname;

    @ColumnInfo(name = "MemberBalance")
    private BigDecimal balance;

    private boolean isSelected = false;

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Member(String firstname, String surname) {
        this.firstname = firstname;
        this.surname = surname;
        this.balance = new BigDecimal(0).setScale(2, RoundingMode.HALF_EVEN);
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }

    public boolean isSelected() {
        return isSelected;
    }

}

实体交易:

@TypeConverters(Converters.class)
@Entity(tableName = "transaction_table")
public class Transaction {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "TransactionID")
    private long id;

    @ColumnInfo(name = "TransactionName")
    private String transactionName;

    @ColumnInfo(name = "TransactionBalance")
    private BigDecimal balance;

    public BigDecimal getBalance() {
        return balance;
    }

    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTransactionName() {
        return transactionName;
    }

    public void setTransactionName(String transactionName) {
        this.transactionName = transactionName;
    }

    public Transaction(String transactionName, BigDecimal balance) {
        this.transactionName = transactionName;
        this.balance = new BigDecimal(String.valueOf(balance)).setScale(2, RoundingMode.HALF_EVEN);
    }
}

这是我的成员活动,我在其中看到所有成员的列表。 余额始终为 0.00,因为我从不使用 setBalance() 方法,余额应该是 getBalance() 方法得到的值。

这是我的交易活动,我可以在其中看到所有交易的列表。

此活动在我单击成员时开始。 然后我会看到成员姓名以及他参与的所有交易。 此处成员的余额通过 DAO 查询获取:SELECT SUM(TransactionBalance)FROM member_transaction_table INNER JOIN transaction_table ON transaction_table.TransactionID = member_transaction_table.Transaction_ID WHERE member_transaction_table.Member_ID =:memberid

第一张图:这是我的会员活动,我看到了所有会员的名单。余额始终为 0.00,因为我从不使用 setBalance() 方法,余额应该是 getBalance() 方法得到的值。

第二张图片:这是我的交易活动,我可以看到所有交易的列表。

第三张图:当我点击一个成员时,这个活动就开始了。然后我会看到成员姓名以及他参与的所有交易。此处成员的余额通过 DAO 查询获取:SELECT SUM(TransactionBalance)FROM member_transaction_table INNER JOIN transaction_table ON transaction_table.TransactionID = member_transaction_table.Transaction_ID WHERE member_transaction_table.Member_ID =:memberid

我不知道如何以及在哪里让应用程序计算交易。计算返回的值应使用 setBalance() 方法设置。

标签: androidandroid-room

解决方案


我建议根本不要balanceMember类中使用列,因为看起来所有数据都应该存储在这个transaction实体中。如果您必须显示某个特定的余额,Member您应该每次计算他的余额。这种方法有一个主要缺点,从性能的角度来看它不是有效的。如果性能比拥有balance列更重要是个好主意,但是Member每次transaction向系统添加新实体时都必须更新实体。


推荐阅读