使用Android LiveData Room ViewModel验证测试场景并一致地设置成员变量的示例

时间:2018-10-13 19:58:55

标签: android viewmodel android-livedata

我一直在使用本教程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();
        }
    });
}
}

感谢任何方向。

0 个答案:

没有答案