java - 为什么我的 android 房间视图模型返回空对象?
问题描述
我想使用房间在我的应用程序中设计数据库。我已经创建了所有必要的类。我的添加查询工作正常。但是当我使用选择查询并尝试从数据库中获取一些数据时,它返回空对象。我没有发现其中的问题。我的实体是用户类。我已经创建了用户 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;
}
解决方案
您需要使用观察者观察 LiveData,并在观察者中获取用户对象。它是异步的,因此您的方法将不起作用,因为您无法直接访问 User 对象,这就是您收到 NullPointerException 的原因。仅仅是因为用户对象不是直接可用的。如果您在 Fragment 中,则在 LiveData 上调用 addObserver(),并传递 getViewLifecycleOwner() 和 Observer。
推荐阅读
- javascript - 如何为 HTML 表格创建所需的 JSON?
- javascript - 在 Javascript 中设置值会导致控制器出现空属性 - MVC
- android - 无法从操作 com.android.vending.billing.PURCHASES_UPDATED 接收广播
- javascript - Ajax 与 XML 自动完成 URL 返回问题
- html - CSS - 响应和精确的宽度 WebBrowser 页面:最佳实践
- alexa - 用户可以通过语音设置 Slots 和 Slots 同义词吗
- javascript - 从给定原型获取 json 结果
- python - 高分文件:将字符串列表转换为整数列表会导致 int() 以 10 为底的无效文字:''
- angular - 在角度指令单元测试中注入服务
- sql - 如何将此查询转换为内部联接