我一直在使用本教程https://codelabs.developers.google.com/codelabs/android-room-with-a-view作为指南,但是遇到了一些问题。
基本上,我希望对其进行调整,以检查用户在NewWordActivity屏幕上单击“保存”后,该Word表中是否已存在条目。
如果是这样,则将产生一条敬酒消息,并且用户将不得不重新输入一个新单词。如果Word还不存在,请保存并移至下一个Intent。
但是我在将Observe()集成到OnClick中时遇到了问题。以下是相关代码的片段。基本上,我的成员布尔变量dosWordExist并不是在observe()的代码中一致地设置的。因此,即使这个词存在,它仍然会继续进入我的代码以将该对象保存在数据库中。
我看过一些示例,其中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();
}
});
}
}
感谢任何方向。