Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从存储库教室数据库中的实时数据中获取值_Java_Android_Android Room_Android Livedata - Fatal编程技术网

Java 如何从存储库教室数据库中的实时数据中获取值

Java 如何从存储库教室数据库中的实时数据中获取值,java,android,android-room,android-livedata,Java,Android,Android Room,Android Livedata,我正在我的应用程序中使用android Jet pack中的Room Architecture组件。我已经实现了Repository类,在该类中我可以管理我的数据源,如服务器和Room数据库中的数据。我使用实时数据获取数据库中所有对象的列表,并在活动类中附加了一个观察者。除了一件事之外,所有的工作都很好。在调用我的服务器之前,我想检查数据是否存在于房间中,如果数据存在于房间中,我不想调用服务器以节省资源,但当我尝试从存储库类的本地数据库获取数据时,它总是返回null。我还尝试将观察者附加到它但是

我正在我的应用程序中使用android Jet pack中的Room Architecture组件。我已经实现了Repository类,在该类中我可以管理我的数据源,如服务器和Room数据库中的数据。我使用实时数据获取数据库中所有对象的列表,并在活动类中附加了一个观察者。除了一件事之外,所有的工作都很好。在调用我的服务器之前,我想检查数据是否存在于房间中,如果数据存在于房间中,我不想调用服务器以节省资源,但当我尝试从存储库类的本地数据库获取数据时,它总是返回null。我还尝试将观察者附加到它但是没有用

public LiveData<List<AllbrandsdataClass>> getAllBrands() {
    brandsDao.getallbrands().observeForever(new Observer<List<AllbrandsdataClass>>() {
        @Override
        public void onChanged(@Nullable final List<AllbrandsdataClass> allbrandsdataClasses) {
            final List<AllbrandsdataClass> listofbrandsobjectfromdb = allbrandsdataClasses;
            if (listofbrandsobjectfromdb == null) {
                Log.d(TAG, "Repository getallbrands number of brands in the DB is: 0");
            } else {
                // perform the logic to check and than fetch from server
            }
            return brandsDao.getallbrands();
        }
    }
}

我想要的是在从服务器获取数据之前对本地数据库中的数据执行签入存储库类,但在使用如上所示的实时数据时,我无法执行此操作。我使用的是“SumOfRowsFromDB”类型的2个实时数据流(收入、费用)。根据您的业务逻辑,您的数据流可以是任意的,在repository类中获取一个Long类型的活动数据“remainingIncome” 首先,我将输入实时数据作为源添加到输出实时数据“remainingIncome”中,在lamda中,我将输出实时数据的值设置为下面定义的方法,现在每当任何输入实时数据更改我的方法“combinedResult(收入、费用)”调用,我可以根据业务逻辑相应地更改输出的值

 public LiveData<Long> getRemainingIncome() {
    MediatorLiveData<Long> remainingIncome = new MediatorLiveData<>();
    LiveData<SumOfRowsFromDB> income = mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(2));
    LiveData<SumOfRowsFromDB> expense = mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(1));
    remainingIncome.addSource(income, value -> {
        remainingIncome.setValue(combinedResult(income, expense));
    });
    remainingIncome.addSource(expense, value -> {
        remainingIncome.setValue(combinedResult(income, expense));
    });
    return remainingIncome;
}

private Long combinedResult(LiveData<SumOfRowsFromDB> income, LiveData<SumOfRowsFromDB> expense) {
    if (income.getValue() != null && expense.getValue() != null) {
        return (income.getValue().getSumOfRow() - expense.getValue().getSumOfRow());
    } else {
        return 0L;
    }
public LiveData getRemainingIncome(){
MediatorLiveData remainingIncome=新MediatorLiveData();
LiveData income=mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(2));
LiveData expense=mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(1));
remainingIncome.addSource(收入、价值->{
剩余收入设置值(合并结果(收入、费用));
});
remainingIncome.addSource(费用、价值->{
剩余收入设置值(合并结果(收入、费用));
});
返回剩余收入;
}
私人长期组合结果(LiveData收入、LiveData费用){
if(income.getValue()!=null和&expense.getValue()!=null){
返回(income.getValue().getSumOfRow()-expense.getValue().getSumOfRow());
}否则{
返回0升;
}

你好,沃尔特,你找到正确的方法了吗?是的,我找到了。如果你还需要帮助,请看这个,让我知道。
 public LiveData<Long> getRemainingIncome() {
    MediatorLiveData<Long> remainingIncome = new MediatorLiveData<>();
    LiveData<SumOfRowsFromDB> income = mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(2));
    LiveData<SumOfRowsFromDB> expense = mainDashBoardDao.getTansWiseSum(Constants.TRANS_TYPES.get(1));
    remainingIncome.addSource(income, value -> {
        remainingIncome.setValue(combinedResult(income, expense));
    });
    remainingIncome.addSource(expense, value -> {
        remainingIncome.setValue(combinedResult(income, expense));
    });
    return remainingIncome;
}

private Long combinedResult(LiveData<SumOfRowsFromDB> income, LiveData<SumOfRowsFromDB> expense) {
    if (income.getValue() != null && expense.getValue() != null) {
        return (income.getValue().getSumOfRow() - expense.getValue().getSumOfRow());
    } else {
        return 0L;
    }