Запрос помещения, который должен возвращать LiveData, всегда возвращает NULL - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу создать экран входа в систему android, используя Room / SQLLite. Как только мое действие по входу в систему запущено, в базу данных будет вставлен объект пользователя.

При нажатии на кнопку входа в систему я хочу найти пользователя по имени пользователя, которое я заполнил. Затем я проверю, если пароль, который я дал, является правильным паролем. Исходя из этого, я перейду к другой операции go или покажу сообщение об ошибке.

Но это не так, следующий код всегда возвращает NULL, поэтому я всегда получаю сообщение об ошибке.

UserWithWorkorders userWithWorkorders = ie4ViewModel.getUserWithWorkorders(username.getText().toString()).getValue();

Вот запрос в UserDao. Как вы видите, он возвращает LiveDate.

 @Query("SELECT * FROM User WHERE username =:username")
 LiveData<UserWithWorkorders> getUserWithWorkorders(String username);

Вот onCreate () моей активности при входе в систему:

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        IE4ViewModel ie4ViewModel = new ViewModelProvider(this).get(IE4ViewModel.class);

        User user = new User("John", "Doe", "john", "doe");
        ie4ViewModel.insertUser(user);

        final Button loginButton = findViewById(R.id.loginButton);
        final EditText username = findViewById(R.id.username);
        final EditText password = findViewById(R.id.password);
        final TextView errorMessage = findViewById(R.id.errorMessage);


        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserWithWorkorders userWithWorkorders = ie4ViewModel.getUserWithWorkorders(username.getText().toString()).getValue();

                if (userWithWorkorders != null) {
                    if(userWithWorkorders.user.getPassword().equals(password.getText().toString())){
                        Intent i = new Intent(LoginActivity.this, WorkordersActivity.class);
                        i.putExtra("userObject", userWithWorkorders);
                        startActivity(i);
                    }
                    else {
                        errorMessage.setVisibility(View.VISIBLE);
                    }
                }
                else {
                    errorMessage.setVisibility(View.VISIBLE);
                }

            }
        });

        ie4ViewModel.getUsersWithWorkorders().observe(this, new Observer<List<UserWithWorkorders>>() {
            @Override
            public void onChanged(List<UserWithWorkorders> usersWithWorkorders) {
                if (usersWithWorkorders != null && usersWithWorkorders.size() > 0) {

                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                        }
                    });
                }
            }
        });
    }

Что я делаю неправильно? Если есть какой-либо другой код, который вы хотели бы увидеть, пожалуйста, дайте мне знать. Или другими словами: как получить объект в моей активности android из базы данных SQLLite, используя Room, если запрос Dao возвращает объект LiveData?

1 Ответ

0 голосов
/ 05 апреля 2020

Для этой строки кода вам не нужно, чтобы она возвращалась наблюдаемой.

UserWithWorkorders userWithWorkorders = ie4ViewModel.getUserWithWorkorders(username.getText().toString()).getValue();

просто объявите метод в вашей модели представления следующим образом.

public UserWithWorkorders getUserWithWorkorders(String value){
//get result from DAO.
}

Также сделайте так, чтобы ваш метод DAO возвращал UserWithWorkorders

Теперь вызовите этот метод в своей деятельности, как вы уже это делаете.

 UserWithWorkorders userWithWorkorders = ie4ViewModel.getUserWithWorkorders(username.getText().toString()).getValue();

Будьте полностью уверены что в вашей базе данных есть данные для возврата.

...