如何从 Repository class Room Database 中的实时数据中获取值
How to get values from live data inside Repository class Room Database
我在我的应用程序中使用来自 android Jet-pack 的 Room Architecture 组件。我已经实现了存储库 class,我在其中管理我的数据源,例如服务器和来自 Room 数据库的数据。我正在使用实时数据来获取数据库中存在的所有对象的列表,并且我在 activity class 中附加了一个观察者。除了在调用我的服务器之前的一件事外,所有工作都很完美我想检查房间中是否存在数据如果房间中存在数据我不想调用服务器以节省资源但是当我尝试从存储库 class 中的本地数据库获取数据,它总是 returns 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();
}
}
}
这是我在接口 class 中的 getAllBrands()
方法,注释为 DAO
@Query("SELECT * FROM AllbrandsdataClass order by timeStamp desc")
LiveData<List<AllbrandsdataClass>> getallbrands();
我想要的是在从服务器获取数据之前在存储库class中检查本地数据库中的数据,但是在使用实时数据时我无法做到这一点,如上所示
下面我使用的是 "SumOfRowsFromDB" 类型的 2 个实时数据流(收入、费用),根据您的业务逻辑,您可以在存储库 class 中获取单个实时数据 "remainingIncome" 长整型
首先,我将我的输入实时数据作为源添加到我的输出实时数据 "remainingIncome" 并且在 lamda 中我将我的输出实时数据的值设置为下面定义的方法,现在只要任何输入实时数据更改我的方法 "combinedResult(income, expense)" 被调用,我可以根据我的业务逻辑相应地更改我的输出值。
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;
}
我在我的应用程序中使用来自 android Jet-pack 的 Room Architecture 组件。我已经实现了存储库 class,我在其中管理我的数据源,例如服务器和来自 Room 数据库的数据。我正在使用实时数据来获取数据库中存在的所有对象的列表,并且我在 activity class 中附加了一个观察者。除了在调用我的服务器之前的一件事外,所有工作都很完美我想检查房间中是否存在数据如果房间中存在数据我不想调用服务器以节省资源但是当我尝试从存储库 class 中的本地数据库获取数据,它总是 returns 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();
}
}
}
这是我在接口 class 中的 getAllBrands()
方法,注释为 DAO
@Query("SELECT * FROM AllbrandsdataClass order by timeStamp desc")
LiveData<List<AllbrandsdataClass>> getallbrands();
我想要的是在从服务器获取数据之前在存储库class中检查本地数据库中的数据,但是在使用实时数据时我无法做到这一点,如上所示
下面我使用的是 "SumOfRowsFromDB" 类型的 2 个实时数据流(收入、费用),根据您的业务逻辑,您可以在存储库 class 中获取单个实时数据 "remainingIncome" 长整型 首先,我将我的输入实时数据作为源添加到我的输出实时数据 "remainingIncome" 并且在 lamda 中我将我的输出实时数据的值设置为下面定义的方法,现在只要任何输入实时数据更改我的方法 "combinedResult(income, expense)" 被调用,我可以根据我的业务逻辑相应地更改我的输出值。
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;
}