【问题标题】:How to synchronously query data from room database?如何从房间数据库中同步查询数据?
【发布时间】:2019-05-09 01:27:55
【问题描述】:

这是我第一次做安卓开发。对不起,我对……一切都缺乏了解。

我正在尝试使用 asynctask 在活动的主线程上查询一些数据。问题是,我查询的数据在其他一些数据查询中是立即需要的,所以查询的异步性意味着每次我需要使用数据时,线程还没有查询到它并给出了一个空指针异常。 有没有办法从房间数据库中同步查询数据?

我尝试了 LiveData 对象的 getValue() 函数,但它也总是返回 null。我确信数据已正确插入数据库中,我在调试时检查了多次查看数据库。

这是我用来查询Day类实体的代码:

 //load current day
        findSpecificDayAsyncTask asyncTask = (findSpecificDayAsyncTask) new findSpecificDayAsyncTask(mDayDao, new findSpecificDayAsyncTask.AsyncResponse() {

            @Override
            public void processFinish(Day output) {
                day1 = output;
            }
}).execute(date);

它在适当的时候工作,但我需要立即数据以便我可以查询 其他一些数据:

mBPViewModel = ViewModelProviders.of(this).get(BulletPointViewModel.class);

                         //the day1 class is used here as a parameter
        mBPViewModel.getSpecificDayBulletPoints(day1.day).observe(this, new Observer<List<BulletPoint>>() {
            @Override
            public void onChanged(@Nullable final List<BulletPoint> bulletPoints) {
                // Update the cached copy of the words in the adapter.
                mAdapter.setBulletPoints(bulletPoints);
            }
        });

那么有没有办法让我同步查询数据,所以我没有得到 空指针异常?

【问题讨论】:

  • 您是否考虑过使用 Executor(线程池)而不是 AsyncTask?
  • @MohammadL 不,我没有,老实说,直到你提到它,我才知道这件事。你知道任何关于如何使用它的好教程吗?还有,如果你一次执行多个任务,是保证它们都被执行了,还是最快的任务先完成?

标签: java android android-asynctask android-room


【解决方案1】:

为什么不这样做

    //load current day
    findSpecificDayAsyncTask asyncTask = (findSpecificDayAsyncTask) new 
    findSpecificDayAsyncTask(mDayDao, new findSpecificDayAsyncTask.AsyncResponse() {

        @Override
        public void processFinish(Day output) {
            day1 = output;
            mBPViewModel = ViewModelProviders.of(this).get(BulletPointViewModel.class);
             //the day1 class is used here as a parameter
            mBPViewModel.getSpecificDayBulletPoints(day1.day).observe(this, new Observer<List<BulletPoint>>() {
                @Override
                public void onChanged(@Nullable final List<BulletPoint> bulletPoints) {
                    // Update the cached copy of the words in the adapter.
                    mAdapter.setBulletPoints(bulletPoints);
                }
            });
        }

    }).execute(date);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2020-04-05
    • 2021-05-21
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多