У меня есть список элементов CardView RecyclerView, который работает правильно. После создания нового CardView, который вставляется в базу данных, я хотел бы запустить тост, который информирует пользователя об успешном добавлении CardView и показывает номер CardView. Номер CardView - это идентификатор элемента CardView, вставленного в базу данных. Данные сохраняются в базе данных, когда пользователь нажимает кнопку «Сохранить», которая запускает onClickSave ().
Я установил @Query в Dao, чтобы получить MAX (cardId):
Dao
...
@Query("SELECT MAX(cardId) FROM cards")
LiveData<Integer> getMax();
@Insert
void insertCard(Card card);
Проблема в том, что два тоста стреляют. Первый тост возвращает ранее созданный номер CardView и , затем второй тост запускает и показывает последний добавленный номер CardView. Например, тост покажет CardView номер 33, а затем будет запущен второй тост, который показывает ожидаемый номер 34 CardView, который был только что создан (я подтверждаю, что CardViews 33 и 34 находятся как в базе данных, так и в двух самых высоких элементах, используя браузер БД дляПрограммное обеспечение SQLite).
AddorUpdateCardActivity
...
private int newMax = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewModel = new ViewModelProvider(this).get(cardViewModel.class);
}
public void onClickSave(View v) {
// set card data
// then insert data in database
mViewModel.insertCard(card1);
mViewModel.getMax().observe(this, value -> { newMax = value; Toast.makeText(AddorUpdateCardActivity.this, "card #" + newMax + " was saved to the list", Toast.LENGTH_LONG).show();});
}
ViewModel
...
public cardViewModel(Application application) {
super(application);
repository = new cardRepository(application);
getMax = repository.getMax();
}
public LiveData<Integer> getMax() {
return getMax;
}
public void insertCard(Card card) {
repository.insertCard(card);
}
cardRepository
private CardDao cardDao;
private LiveData<Integer> getMax;
public cardRepository(Application application) {
RoomDatabase db = RoomDatabase.getDatabase(application);
cardDao = db.cardDao();
}
public LiveData<Integer> getMax() {
return cardDao.getMax;
}
public void insertCard(Quickcard newcard) {
AsyncTask.execute(() -> cardDao.insertCard(newcard));
}
Что мне здесь не хватает? Если карта правильно вставлена в базу данных, то почему наблюдатель ViewModel просто не вернет этот новый номер CardView, а не два тоста?
Для справки я показываю предыдущий код, который я использовал до Room и ViewModel, которые использовали курсор для получения самого последнего и самого высокого вставленного идентификатора:
public class SQLiteDB extends SQLiteOpenHelper {
...
public int getLastInsertId() {
int index = 0;
SQLiteDatabase sdb = getReadableDatabase();
Cursor cursor = sdb.query(
"sqlite_sequence",
new String[]{"seq"},
"name = ?",
new String[]{TABLE_NAME},
null,
null,
null,
null
);
sdb.beginTransaction();
try {
if (cursor !=null) {
if (cursor.moveToLast()) {
index = cursor.getInt(cursor.getColumnIndex("seq"));
}
}
...
}
return index;
}