Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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
Android 如果找不到对象,为什么flowable不返回任何数据_Android_Android Room - Fatal编程技术网

Android 如果找不到对象,为什么flowable不返回任何数据

Android 如果找不到对象,为什么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(“从日期=:日期的金额中选择金额”

我使用FlowTable从日期后获取数据,它会不断返回以获取以前的日期数据,现在FlowTable的问题是,如果没有找到日期,它会卡住,甚至不会给出空错误,这样我就可以跳过 我能在这里做什么。如何使用单一和可能

DAO

 @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争论