You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio使用ROOM数据库查询少一个对象且RecyclerView更新滞后

问题根源

你的代码出现操作滞后问题是执行顺序错误导致的:
addEvent()方法中,数据库插入操作是通过Handler.post()放到主线程消息队列末尾排队执行的,而你调用完addEvent()后立刻执行了refreshEvents()查询数据库,此时插入操作还未执行,查询到的是插入前的旧数据。等下一次操作触发刷新时,上一次的插入已经完成,才会显示之前新增的内容,删除操作同理也是执行顺序的问题。

修复方案

方案1:调整执行顺序(快速适配现有代码)

把刷新列表的逻辑放到插入操作执行完成之后,修改addEvent()方法即可:

private void addEvent() {
    String eventTitle, eventInfo, eventDeadline;
    eventTitle = etTitleNewEvent.getText().toString();
    eventInfo = etInfoNewEvent.getText().toString();
    eventDeadline = etDeadlineNewEvent.getText().toString();

    //创建事件对象
    Event event = new Event(eventTitle, eventInfo, eventDeadline);

    Handler handler = new Handler();

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            eventsDao.createEvent(event);
            Toast.makeText(Dashboard.this, "事件创建成功", Toast.LENGTH_SHORT).show();
            // 插入完成后再刷新列表,保证查询到最新数据
            refreshEvents();
        }
    };

    handler.post(runnable);
}

同时删除点击确认按钮时重复的refreshEvents()调用:

btnOKNewEvent.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        addEvent();
        alertDialog.dismiss();
    }
});

方案2:规范ROOM异步操作(推荐用于正式项目)

你当前是在主线程执行数据库操作,需要在ROOM数据库配置中开启allowMainThreadQueries才不会崩溃,正式项目不推荐这么做,建议使用更规范的实现:

  • 把DAO的查询方法返回值改为LiveData<List<Event>>,ROOM会自动在子线程执行查询,数据变化时自动通知观察者,你只需要在onCreate中观察一次LiveData,自动更新RecyclerView即可,不需要手动调用refreshEvents。
  • 插入、删除操作放到子线程执行,可以用协程、AsyncTask或者RxJava实现。

内容的提问来源于stack exchange,提问作者Ankit Kumar Maurya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:45:03