Java 房间+现场数据调试
我正在尝试创建一个登录函数,该函数将检查数据库中是否存在用户名:- 我需要成功地将实时数据从房间数据库获取到存储库以查看模型。下面是代码。它不起作用,但将尝试其中一个建议 当我从DB行加载时:-Java 房间+现场数据调试,java,android,sqlite,android-room,android-livedata,Java,Android,Sqlite,Android Room,Android Livedata,我正在尝试创建一个登录函数,该函数将检查数据库中是否存在用户名:- 我需要成功地将实时数据从房间数据库获取到存储库以查看模型。下面是代码。它不起作用,但将尝试其中一个建议 当我从DB行加载时:- UserDetails= dao.loadUserDetails(UserName); Log.v("Response", UserDetails.getValue().getToken()); 我无法调用Null 我对实现这样一个功能的最佳方式以及如何解决这个问题感到困惑 存储库 publ
UserDetails= dao.loadUserDetails(UserName);
Log.v("Response", UserDetails.getValue().getToken());
我无法调用Null
我对实现这样一个功能的最佳方式以及如何解决这个问题感到困惑
存储库
public MutableLiveData<String> LoginUser(String UserName,String Password ) {
//
// rUserDetails.setUsername("nadeem");
// rUserDetails.setPassword("test");
// rUserDetails.setToken(AppConstants.PARAMS);
// rUserDetails.setSid("1234");
// rUserDetails.setResourcId(Long.valueOf(12134));
// insert(rUserDetails);
UserDetails= dao.loadUserDetails(UserName);
Log.v("Response", UserDetails.getValue().getToken());
if(UserDetails.getValue()!=null) {
rUserDetails.setUsername(UserName);
rUserDetails.setPassword(Password);
rUserDetails.setToken(AppConstants.PARAMS);
Observable<MainResponse> mainResponseObserver = mtsAPI.GetSessionID("token/login", AppConstants.PARAMS + "");
mainResponseObserver.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MainResponse>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(MainResponse mainResponse) {
Log.v("Response", mainResponse.getEid());
if (mainResponse.getEid()==null) {
msessionId.postValue("Token Error");
}
else {
msessionId.postValue("1");
rUserDetails.setSid(mainResponse.getEid());
rUserDetails.setResourcId(mainResponse.getUserVO().getBact());
insert(rUserDetails);
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
else {
msessionId.postValue("E");
}
return msessionId;
}
我被卡在检查用户数据是否在房间数据库中的部分。如果在房间DB中,它返回UserDetails,这是一个可变的实时数据
我已经测试了数据库。当我单独测试它们时,它成功插入并成功读取
刀
使用上面的代码,我无法调用Null。。。。在UserDetails.getvalue.getToken上,您正在使用LiveData获取此Dao方法中声明的用户详细信息
LiveData<UserLoginDetails> loadUserDetails(String userId);
如果需要不带观察者的值,可以将返回类型更改为非LiveData,如下所示
UserLoginDetails loadUserDetails(String userId);
在这种情况下,不能在主线程上调用此方法。您需要在后台线程上调用此数据库同步操作方法,就像使用Schedulers.io线程使用RxJava一样
可能的解决方案是使用RxJava,并留出空间返回可流动的用户数据,例如,如架构组件示例中所示-
更改loadUserDetails以返回Flowable
因此,当您变得可流动时,您可以应用各种运算符来检查所需的条件,并可以将此流转换为布尔可观测值,其值取决于您的条件。对于这个特定的用例,这将是一种非常简单且易于维护的方法。谢谢您的帮助。我会尝试重新编辑这个问题,虽然我只是好奇。你认为这是实现用户登录的正确方法吗?还是有更好的办法。。因为我只是个新手。。最后,我有一个令人敬畏的问题,在我实施了你的第一部分建议的公共空间onChanged@NullableProductEntity ProductEntity{model.setproductentity;}我现在似乎可以将数据获取到我的活动中,但现在,每次单击“登录”时,显示登录成功或失败的警报对话框大约会出现3到4次。
// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
model.setProduct(productEntity);
}
});
UserLoginDetails loadUserDetails(String userId);
Flowable<UserLoginDetails?> loadUserDetails(String userId);
// Map the result to desired format
// Using RxJava operators to perform checks
// If user is null or not
public void checkUserExists(String userId) {
dao.loadUserDetails(userId)
.map(new Function<UserLoginDetails, Boolean>() {
@Override
public Boolean apply(UserLoginDetails userLoginDetails) throws Exception {
if(userLoginDetails == null){
return false;
} else {
return true;
}
}
})
.subscribe(getObserver());
}