【问题标题】:Why my android room viewmodel returns null object?为什么我的 android 房间视图模型返回空对象?
【发布时间】:2020-07-09 15:57:58
【问题描述】:

我想在我的应用程序中使用 room 设计数据库。我已经创建了所有必要的类。我的添加查询工作正常。但是当我使用选择查询并尝试从数据库中获取一些数据时,它返回空对象。我没有发现其中的问题。我的实体是用户类。我已经创建了用户 dao、用户存储库和用户视图模型。在我的片段中,我想从数据库中获取数据。我的片段的一部分是:

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;
    }

【问题讨论】:

  • 能否请您发布 User 和 Pass 对象源代码...作为例外,可能保存不起作用...
  • @AnisBENNSIR 我已经添加了用户对象。 pass 是一个字符串
  • 你确定你的用户类注释很好吗?您在数据库中看到任何已保存的用户吗?您如何测试 @Insert 是否正常工作?
  • @AnisBENNSIR 插入正在工作。我通过插入用户值来检查它。

标签: java android database android-room


【解决方案1】:

您需要使用观察者观察 LiveData,并在观察者中获取用户对象。它是异步的,因此您的方法将不起作用,因为您无法直接访问 User 对象,这就是您收到 NullPointerException 的原因。仅仅是因为用户对象不是直接可用的。 如果您在 Fragment 中,则在 LiveData 上调用 addObserver() 并传递 getViewLifecycleOwner() 和 Observer。

【讨论】:

  • 仍然无法正常工作。同样的空对象错误来了。实际上,我不需要在这里使用 livedata。如何在不使用 livedata 的情况下从数据库中读取数据?我不想在主线程中阅读它。对于写作,我使用的是 databaseWriteExecutor。但是如何阅读呢?
  • 如果您不需要 LiveData 用户对象,那么您应该在 DAO 类中返回一个用户对象,而不是 LiveData 对象。然后您可以直接访问它,但正如您所说,您不应该在 MainThread 上执行此操作,因为它会引发异常。而且您应该始终在访问之前检查 User 对象是否为空,因为它可能根本不存在于您的表中!
  • 如果返回所有用户的方法返回一个大小为 0 的列表,那么您的 addUser 方法似乎有问题。那么你怎么知道你的插入方法有效呢?如果您无法从您的表中获取用户,您如何确认?
  • 我在 sql 浏览器中检查了我的表。它在表格中显示用户。我尝试使用该用户登录。所以,它应该得到数据
  • 这真的很奇怪。请使用 Room 注释发布您的完整用户类,您的实现可能有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2021-08-17
  • 2021-12-04
  • 1970-01-01
  • 2012-10-04
  • 2017-05-22
相关资源
最近更新 更多