Пример использования Android LiveData Room ViewModel для проверки сценария тестирования и последовательного задания переменной-члена - PullRequest
0 голосов
/ 13 октября 2018

Я использовал этот учебник 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();
        }
    });
}
}

Спасибо за любое направление.

...