Почему моя модель просмотра комнаты android возвращает нулевой объект? - PullRequest
0 голосов
/ 09 июля 2020

Я хочу создать базу данных в своем приложении, используя room. Я создал все необходимые классы. Мой запрос на добавление работает нормально. Но когда я использую запрос выбора и пытаюсь получить некоторые данные из базы данных, он возвращает нулевой объект. Я не вижу в этом проблемы. Моя сущность - это класс пользователя. Я создал User dao, User репозиторий и User viewmodel. В своем фрагменте я хочу получить данные из базы данных. Часть моего фрагмента:

private boolean invalidPass(String user, String pass) {
        boolean invalid = false;
        LiveData<User> userLog = nUserViewModel.getUserByPhone(user);
        if (!userLog.getValue().getPass().equals(pass))
            invalid = true;
        return invalid;
 }

Мой дао здесь:

@Dao
public interface UserDao {

    @Insert
    public void addUser(User user); //this works fine

    @Query("SELECT * from user_info") //does not work
    List<User> getAllUsers();

    @Query("SELECT * from user_info where phone= :phoneN") //does not work
    public LiveData<User> getUserByPhone(String phoneN);

    @Query("UPDATE user_info SET pass = :passN where phone= :phoneN")
    public void updatePassword(String passN, String phoneN);

    @Delete
    public void deleteUser(User user);
}

Репозиторий:

public LiveData<User> getUserByPhone(String phone) {
       userNow = mUserDao.getUserByPhone(phone);
       return userNow;
    }

модель просмотра:

public LiveData<User> getUserByPhone(String phone) {
        return mRepository.getUserByPhone(phone);
    }

Ошибка показывает:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String <package name>.User.getPass()' on a null object reference

Пользовательский объект:

public User(@NonNull String phone, String name, String dob, String address, String email, String pass) {
        this.phone=phone;
        this.name = name;
        this.dob=dob;
        this.address=address;
        this.email=email;
        this.pass=pass;
    }

    @NonNull
    public String getPhone() {
        return phone;
    }

    public void setPhone(@NonNull String uPhone) {
        this.phone = uPhone;
    }

    public String getName() {
        return name;
    }

    public void setName(String uName) {
        this.name = uName;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String uDOB) {
        this.dob = uDOB;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String uAddress) {
        this.address = uAddress;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String uEmail) {
        this.email = uEmail;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String uPass) {
        this.pass = uPass;
    }

1 Ответ

0 голосов
/ 09 июля 2020

Вам нужно наблюдать LiveData с помощью Observer, а в Observer вы получаете пользовательский объект. Это asyn c, поэтому ваш метод не будет работать, потому что у вас нет прямого доступа к объекту User, и именно поэтому вы получаете исключение NullPointerException. Просто потому, что объект пользователя напрямую недоступен. Если вы находитесь во фрагменте, вы вызываете addObserver () для LiveData, передавая getViewLifecycleOwner () и Observer.

...