Я использовал этот учебник https://codelabs.developers.google.com/codelabs/android-room-with-a-view как руководство, но столкнулся с некоторыми проблемами.
В основном, я хочу настроить его, чтобы проверить, существует ли уже запись в этой таблице Wordкак только пользователь нажимает сохранить на экране NewWordActivity.
Если это так, то это приведет к появлению всплывающего сообщения, и пользователь должен будет повторно ввести новое слово Word.Если Word еще не существует, сохраните его и перейдите к следующему Намерению.
Но я сталкиваюсь с проблемами, связанными с включением наблюдений () в OnClick.Ниже приведены фрагменты соответствующего кода.По сути, моя логическая переменная memberWordExist не установлена последовательно в коде наблюдателя ().Таким образом, даже если слово существует, оно все равно переходит к моему коду для сохранения объекта в базе данных.
Я видел примеры, когда LiveData возвращает список, а затем обрабатывается в RecyclerView, чтобы показатьданные, но я не видел четкого примера, где я просто хочу получить данные LiveData (через вызов метода репозитория), а затем применить к ним некоторую логику, а затем получить результат изменения переменных-членов и т. д.
В Word.java
@Entity(tableName = "word_table")
public class Word {
@PrimaryKey
@NonNull
@ColumnInfo(name = "word")
private String mWord;
public Word(@NonNull String word) {
this.mWord = word;
}
@NonNull
public String getWord() {
return this.mWord;
}
В WordDao
@Query("SELECT * from word_table WHERE word= :word")
LiveData<Word> getWord(String word);
В WordRepositiory
LiveData<Word> getWord(String word) {
return mWordDao.getWord(word);
}
В WordViewModel
LiveData<Word> getWord(String word) {
return mRepository.getWord(word);
}
В NewWordActivity
public class NewWordActivity extends AppCompatActivity {
private WordViewModel mWordViewModel;
public static final String EXTRA_REPLY = "com.example.android.wordlistsql.REPLY";
private EditText mEditWordView;
private boolean doesWordExist = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_word);
mEditWordView = findViewById(R.id.edit_word);
final Button button = findViewById(R.id.button_save);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent replyIntent = new Intent();
if (TextUtils.isEmpty(mEditWordView.getText())) {
setResult(RESULT_CANCELED, replyIntent);
// if word already exists
} else {
// Get a new or existing ViewModel from the ViewModelProvider.
mWordViewModel = ViewModelProviders.of(NewWordActivity.this).get(WordViewModel.class);
mWordViewModel.getWord(mEditWordView.getText().toString()).observe(NewWordActivity.this, new Observer<Word>() {
@Override
public void onChanged(@Nullable final Word word) {
// Update the cached copy of the words in the adapter.
if (word != null) {
doesWordExist = true;
// toast that word exists
} else {
doesWordExist = false;
// move on to the next intent
}
}
});
}
// } else {
// String word = mEditWordView.getText().toString();
// replyIntent.putExtra(EXTRA_REPLY, word);
// setResult(RESULT_OK, replyIntent);
// }
finish();
}
});
}
}
Спасибо за любое направление.