Комната: Как связать идентификатор объекта с идентификатором участника - PullRequest
0 голосов
/ 06 июля 2018

Я работаю с базой данных Android Room.

У меня есть сущность "Участник" и сущность "Транзакция". Я хочу создать новую транзакцию (например, купить книгу). Затем я хочу связать всех участников (по идентификатору) с идентификатором транзакции. Это означает, что если 5 человек покупают книгу, то я хочу связать 5 идентификаторов с идентификатором транзакции.

После этого баланс участника должен измениться (например, член имеет 20 евро, а книга стоит 10, после транзакции - член должен иметь 10 евро).

У меня есть операция по созданию новой транзакции. Теперь я хочу создать новое действие, которое должно быть запущено после NewTransactionActivity для обработки привязки членов к транзакции.

Как связать идентификатор транзакции с несколькими идентификаторами участника? Кроме того, как я могу выполнять расчеты с BigDecimal? Поэтому, когда я совершаю новую транзакцию, баланс каждого связанного участника должен измениться.

Прямо сейчас, у меня есть баланс в типе double, но я собираюсь изменить его.

Класс транзакции:

@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;
}

}

Участник класса:

@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;
}

}

Новая транзакционная активность:

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();
        }
    });
}
}

1 Ответ

0 голосов
/ 06 июля 2018

Добавьте MemberId в свой класс сущности Transaction.java, а также установите @ForeignKey с Member.java классом сущности.

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
}

Как связать идентификатор транзакции с несколькими идентификаторами участника?

Если в вашем приложении есть раздельный платеж, вам необходимо сопоставить идентификатор транзакции нескольким участникам.

Приведенный выше код отобразит одно-много отношений между участником и таблицей транзакций. Один участник может делать много транзакций.

Вы можете получить все транзакции пользователя по следующему запросу:

@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);

Чтобы обновить баланс Участника, вы должны написать запрос на обновление баланса, в котором вы должны проверить доступный баланс Участника и вычесть сумму транзакции из общего баланса Участника, которая будет отражена в столбце Баланс member_table.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...