房间:如何 link 对象 ID 到成员 ID
Room: How to link an object id to a member id
我使用 Android 房间数据库。
我有一个实体 "Member" 和一个实体 "Transaction"。我想创建一个新的交易(例如买一本书)。然后我想 link 所有成员(每个 id)和交易 id。这意味着如果有 5 个人购买了这本书,那么我想要 link 5 个带有交易 ID 的 ID。
在我这样做之后,会员中的余额应该发生变化(例如,会员有 20 欧元,而这本书的成本为 10,交易后 - 会员应该有 10 欧元)。
我有 activity 创建新交易的权限。现在我想创建一个新的 activity,它应该在 NewTransactionActivity 之后启动,以处理成员对交易的 linking。
我如何 link 具有多个会员 ID 的交易 ID?
另外,如何使用 BigDecimal 进行计算?
所以当我进行新交易时,每个 linked 成员的余额都应该改变。
现在,我的余额是 double 类型,但我要更改它。
Class 交易:
@Entity(tableName = "transaction_table")
public class Transaction {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "TransactionID")
private long id;
@ColumnInfo(name = "Transaction Name")
private String transactionName;
@ColumnInfo(name = "Transaction Balance")
private double balance;
public double getBalance() {
return balance;
}
public void setBalance(double 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, double balance) {
this.transactionName = transactionName;
this.balance = balance;
}
}
Class 会员:
@Entity(tableName = "member_table")
public class Member {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "MemberID")
private long id;
@ColumnInfo(name = "First Name")
private String firstname;
@ColumnInfo(name = "Surname")
private String surname;
@ColumnInfo(name = "Balance")
private double balance;
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 double getBalance() {
return balance;
}
public void setBalance(double 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 = 0;
}
}
新交易Activity:
public class NewTransactionActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.android.transactionlistsql.REPLY";
public static final String EXTRA_REPLY2 = "com.example.android.transactionlistsql.REPLY2";
private EditText mEditTextTransaction;
private EditText mEditTextTransaction2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newtransaction_activity);
mEditTextTransaction = findViewById(R.id.NewTransactionName);
mEditTextTransaction2 = findViewById(R.id.NewTransactionBalance);
mEditTextTransaction2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
mEditTextTransaction2.setText("0");
final Button button = findViewById(R.id.NewTransactionButtonSave);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent replyIntent = new Intent();
if (TextUtils.isEmpty(mEditTextTransaction.getText())){
Toast.makeText(getApplicationContext(), R.string.TransactionNameMissing, Toast.LENGTH_LONG).show();
return;
//setResult(RESULT_CANCELED, replyIntent);
}
else if (TextUtils.isEmpty(mEditTextTransaction2.getText())){
mEditTextTransaction2.setText("0");
}
else {
String newtransactionname = mEditTextTransaction.getText().toString()
double newtransactionbalance = Double.parseDouble(mEditTextTransaction2.getText().toString()));
replyIntent.putExtra(EXTRA_REPLY, newtransactionname);
replyIntent.putExtra(EXTRA_REPLY2, newtransactionbalance);
setResult(RESULT_OK, replyIntent);
}
finish();
}
});
}
}
在您的 Transaction.java
实体 class 中添加 MemberId,同时将 @ForeignKey
设置为 Member.java
实体 class。
Transaction.java
import static android.arch.persistence.room.ForeignKey.CASCADE;
@Entity(tableName = "transaction_table", foreignKeys = @ForeignKey(entity = Member.class,
parentColumns = "MemberID",
childColumns = "member_id",
onDelete = CASCADE))
public class Transaction {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "TransactionID")
private long id;
@ColumnInfo(name = "member_id")
private long MemberId;
public long getMemberId() {
return MemberId;
}
public void setMemberId(long memberId) {
MemberId = memberId;
}
//Rest of the fields
}
How do I link a transaction id with multiple member ids?
如果您的应用程序中存在拆分付款,那么您必须将交易 ID 映射到多个成员。
以上代码将映射 Member 和 Transaction 之间的一对多关系 table。一个会员可以做很多笔交易。
您可以通过以下查询获取所有用户的交易:
@Query("SELECT * FROM transaction_table tt INNER JOIN member_table mt on tt.member_id = mt.MemberID WHERE member_id =:memberId")
List<Transaction> getMemberTransactions(long memberId);
要更新会员的余额,您必须编写更新余额查询,其中您必须检查会员的可用余额,并且必须从会员的总余额中扣除交易金额,这将反映在 [=31 的余额列=].
我使用 Android 房间数据库。
我有一个实体 "Member" 和一个实体 "Transaction"。我想创建一个新的交易(例如买一本书)。然后我想 link 所有成员(每个 id)和交易 id。这意味着如果有 5 个人购买了这本书,那么我想要 link 5 个带有交易 ID 的 ID。
在我这样做之后,会员中的余额应该发生变化(例如,会员有 20 欧元,而这本书的成本为 10,交易后 - 会员应该有 10 欧元)。
我有 activity 创建新交易的权限。现在我想创建一个新的 activity,它应该在 NewTransactionActivity 之后启动,以处理成员对交易的 linking。
我如何 link 具有多个会员 ID 的交易 ID? 另外,如何使用 BigDecimal 进行计算? 所以当我进行新交易时,每个 linked 成员的余额都应该改变。
现在,我的余额是 double 类型,但我要更改它。
Class 交易:
@Entity(tableName = "transaction_table")
public class Transaction {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "TransactionID")
private long id;
@ColumnInfo(name = "Transaction Name")
private String transactionName;
@ColumnInfo(name = "Transaction Balance")
private double balance;
public double getBalance() {
return balance;
}
public void setBalance(double 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, double balance) {
this.transactionName = transactionName;
this.balance = balance;
}
}
Class 会员:
@Entity(tableName = "member_table")
public class Member {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "MemberID")
private long id;
@ColumnInfo(name = "First Name")
private String firstname;
@ColumnInfo(name = "Surname")
private String surname;
@ColumnInfo(name = "Balance")
private double balance;
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 double getBalance() {
return balance;
}
public void setBalance(double 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 = 0;
}
}
新交易Activity:
public class NewTransactionActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.android.transactionlistsql.REPLY";
public static final String EXTRA_REPLY2 = "com.example.android.transactionlistsql.REPLY2";
private EditText mEditTextTransaction;
private EditText mEditTextTransaction2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newtransaction_activity);
mEditTextTransaction = findViewById(R.id.NewTransactionName);
mEditTextTransaction2 = findViewById(R.id.NewTransactionBalance);
mEditTextTransaction2.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
mEditTextTransaction2.setText("0");
final Button button = findViewById(R.id.NewTransactionButtonSave);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent replyIntent = new Intent();
if (TextUtils.isEmpty(mEditTextTransaction.getText())){
Toast.makeText(getApplicationContext(), R.string.TransactionNameMissing, Toast.LENGTH_LONG).show();
return;
//setResult(RESULT_CANCELED, replyIntent);
}
else if (TextUtils.isEmpty(mEditTextTransaction2.getText())){
mEditTextTransaction2.setText("0");
}
else {
String newtransactionname = mEditTextTransaction.getText().toString()
double newtransactionbalance = Double.parseDouble(mEditTextTransaction2.getText().toString()));
replyIntent.putExtra(EXTRA_REPLY, newtransactionname);
replyIntent.putExtra(EXTRA_REPLY2, newtransactionbalance);
setResult(RESULT_OK, replyIntent);
}
finish();
}
});
}
}
在您的 Transaction.java
实体 class 中添加 MemberId,同时将 @ForeignKey
设置为 Member.java
实体 class。
Transaction.java
import static android.arch.persistence.room.ForeignKey.CASCADE;
@Entity(tableName = "transaction_table", foreignKeys = @ForeignKey(entity = Member.class,
parentColumns = "MemberID",
childColumns = "member_id",
onDelete = CASCADE))
public class Transaction {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "TransactionID")
private long id;
@ColumnInfo(name = "member_id")
private long MemberId;
public long getMemberId() {
return MemberId;
}
public void setMemberId(long memberId) {
MemberId = memberId;
}
//Rest of the fields
}
How do I link a transaction id with multiple member ids?
如果您的应用程序中存在拆分付款,那么您必须将交易 ID 映射到多个成员。
以上代码将映射 Member 和 Transaction 之间的一对多关系 table。一个会员可以做很多笔交易。
您可以通过以下查询获取所有用户的交易:
@Query("SELECT * FROM transaction_table tt INNER JOIN member_table mt on tt.member_id = mt.MemberID WHERE member_id =:memberId")
List<Transaction> getMemberTransactions(long memberId);
要更新会员的余额,您必须编写更新余额查询,其中您必须检查会员的可用余额,并且必须从会员的总余额中扣除交易金额,这将反映在 [=31 的余额列=].