Java 房间+现场数据调试

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

我正在尝试创建一个登录函数,该函数将检查数据库中是否存在用户名:-

我需要成功地将实时数据从房间数据库获取到存储库以查看模型。下面是代码。它不起作用,但将尝试其中一个建议

当我从DB行加载时:-

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