Android 如果找不到对象,为什么flowable不返回任何数据
我使用FlowTable从日期后获取数据,它会不断返回以获取以前的日期数据,现在FlowTable的问题是,如果没有找到日期,它会卡住,甚至不会给出空错误,这样我就可以跳过 我能在这里做什么。如何使用单一和可能 DAOAndroid 如果找不到对象,为什么flowable不返回任何数据,android,android-room,Android,Android Room,我使用FlowTable从日期后获取数据,它会不断返回以获取以前的日期数据,现在FlowTable的问题是,如果没有找到日期,它会卡住,甚至不会给出空错误,这样我就可以跳过 我能在这里做什么。如何使用单一和可能 DAO @Query("SELECT SUM(amount) FROM Amount WHERE date=:date") Flowable<Float> getdateSum(String date); @Query(“从日期=:日期的金额中选择金额”
@Query("SELECT SUM(amount) FROM Amount WHERE date=:date")
Flowable<Float> getdateSum(String date);
@Query(“从日期=:日期的金额中选择金额”)
可流动的getdateSum(字符串日期);
数据源
@Override
public Flowable<Float> getdateSum(String date) {
return DAO.getdateSum(date);
}
Flowable<Float> getdateSum(String date);
@覆盖
公共可流动getdateSum(字符串日期){
返回DAO.getdateSum(日期);
}
Idatasource
@Override
public Flowable<Float> getdateSum(String date) {
return DAO.getdateSum(date);
}
Flowable<Float> getdateSum(String date);
可流动的getdateSum(字符串日期);
存储库
@Override
public Flowable<Float> getdateSum(String date) {
return mLocalDataSource.getdateSum(date);
}
@覆盖
公共可流动getdateSum(字符串日期){
返回mLocalDataSource.getdateSum(日期);
}
获取总和的代码
Disposable disposable1 = Repository.getdateSum(date)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<Float>() {
@Override
public void accept(Float sum) throws Exception {
Toast.makeText(getActivity(),sum, Toast.LENGTH_SHORT).show();
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {});
disposable1=Repository.getdateSum(日期)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.订阅(新消费者){
@凌驾
public void accept(Float sum)引发异常{
Toast.makeText(getActivity(),sum,Toast.LENGTH_SHORT).show();
},新消费者(){
@凌驾
public void accept(Throwable Throwable)抛出异常{});
如果找不到该对象,则应执行Toast或加载对象为空的布局,请提供更多信息。因此,如果我理解正确,您希望显示包含3个标题的项目列表:第一年、第二年、第三年?! 由于您的问题包含的信息很少,我将尝试用一个虚构的示例向您解释如何在回收器视图中显示标题: 假设您有一个名为“Product”的对象和一个名为“header”的字符串。该字符串将用作标题,而应用程序将显示产品列表 首先,您需要为两种项目类型创建两个布局。一个用于产品,另一个用于标题 我认为您熟悉Recyclerviews和适配器。我们将在活动/片段中创建“产品”和字符串的列表,并在适配器类中声明该列表。如下所示:
var productHeaderList = listOf<Any>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
viewTypeHeader -> HeaderHolder(LayoutInflater.from(context).inflate(R.layout.item_header, parent, false))
viewTypeProduct -> ProductHolder(LayoutInflater.from(context).inflate(R.layout.item_product, parent, false))
else -> EmptyHolder(LinearLayout(context))
}
}
您的适配器中可能已经有一个holder类。您将需要其中两个类。“HeaderHolder”和“ProductHolder”。重写onCreateViewHolder方法并调用这两个标头:如下所示:
var productHeaderList = listOf<Any>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
viewTypeHeader -> HeaderHolder(LayoutInflater.from(context).inflate(R.layout.item_header, parent, false))
viewTypeProduct -> ProductHolder(LayoutInflater.from(context).inflate(R.layout.item_product, parent, false))
else -> EmptyHolder(LinearLayout(context))
}
}
您还需要声明项的类型。重写getItemViewType方法,获取列表中的当前项并将其分配给正确的viewType。该方法可能如下所示:
override fun getItemViewType(position: Int): Int {
return if (productHeaderList.isNotEmpty()) {
val current = productHeaderList[position]
when (current) {
is String -> viewTypeHeader
is Product -> viewTypeProduct
else -> viewTypeEmpty
}
} else {
viewTypeEmpty
}
}
然后,您只需要用数据填充您的项目。转到onBindViewHolder()方法,将数据写入文本视图,例如,基于当前的holder
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ProductHolder) {
val current = productHeaderList[position] as Product
holder.textViewPrice.text = current.price
} else if (holder is HeaderHolder) {
//set your header text here
}
}
希望,我可以帮助您。使用Single如果在此处找不到对象,它会给出错误null。如果找不到对象,您将使用flowable,它会卡住,因此不会出现错误 刀
@Query(“从日期=:日期的金额中选择金额”)
单个getdateSum(字符串日期);
数据源
@Override
public Single<Float> getdateSum(String date) {
return DAO.getdateSum(date);
}
@覆盖
公共单getdateSum(字符串日期){
返回DAO.getdateSum(日期);
}
Idatasource
Single<Float> getdateSum(String date);
Repository
@Override
public Single<Float> getdateSum(String date) {
return mLocalDataSource.getdateSum(date);
}
单个getdateSum(字符串日期);
存储库
@凌驾
公共单getdateSum(字符串日期){
返回mLocalDataSource.getdateSum(日期);
}
获取和的代码
Disposable disposable1 = Repository.getdateSum(date)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribeWith(new DisposableSingleObserver<Float>() {
@Override
public void onSuccess(Float incomesum) {
//on success action
}
@Override
public void onError(Throwable throwable) {
if (throwable.getCause() == null) {
//your action if null
}
}
}
);
disposable1=Repository.getdateSum(日期)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribowith(新的可处置SingleObserver(){
@凌驾
成功时的公共无效(浮动收入){
//论成功行动
}
@凌驾
公共作废登记员(可丢弃){
if(throwable.getCause()==null){
//如果为null,则返回您的操作
}
}
}
);
为什么你有3个基于年份的表?你不能把它们都放在一个表中,并有三个不同的查询吗?或者只需要一个查询就可以得到这三个表吗?现在还不清楚你到底想要什么,应该如何排序,以及实现这一点的具体问题是什么。请不要试图回答,直到你确定你理解了q争论