带 Room 的 Android BroadcastReceiver 数据库访问

Eph*_*rom 5 android broadcastreceiver android-database android-broadcastreceiver android-room

我设置了一个闹钟,每小时调用一个广播接收器。此接收器尝试从 sqlite 数据库加载数据。

问题是,提醒列表为空。相同的代码适用于活动,但不适用于接收器。有什么我必须改变才能访问接收器中的数据库的吗?这是活动和接收器中不同上下文的问题吗?

“setAlarm”方法是我用来创建活动警报的方法。

问候

public class AppReceiver extends BroadcastReceiver {

    private static final String TAG = "AppReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        ReminderRepository mRepository; = new ReminderRepository(context);
        List<Reminder> list = mRepository.getAllReminder();
        for(Reminder r : list) {
            // TODO
        }
    }
}


public class ReminderRepository {

    private ReminderDao mReminderDao;
    private List<Reminder> mAllReminder;

    public DisposalCalenderRepository(Context context) {
        ReminderRoomDatabase db = ReminderRoomDatabase.getDatabase(context);
        mReminderDao = db.reminderDao();
        mAllReminder = mReminderDao.getAll();
    }

    public List<Reminder> getAllReminder(){
        return mAllReminder;
    }

}

@Dao
public interface ReminderDao {

    @Query("SELECT * from reminder")
    List<Reminder> getAll();

}

public void setAlarm(){
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.HOUR, 1);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    AlarmManager alarmMgr = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(mContext, AppReceiver.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(mContext, 0, i, 0);

    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_HOUR, alarmIntent);
    }
Run Code Online (Sandbox Code Playgroud)

Eph*_*rom 7

我为我的问题找到了两个可能的答案。

解决方案 1:启动异步任务。创建一个 AsyncTask 类并在 doBackground 方法中执行操作。访问数据库没有更多问题。

@Override
public void onReceive(Context context, Intent intent) {
    new notifyAsyncTask().execute(context);
}

private static class notifyAsyncTask extends AsyncTask<Context, Void, Void> {

        private String CHANNEL_ID = "1a2b3c4d";

        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        @Override
        protected Void doInBackground(Context... params) {
            Log.i(TAG, "Notify async started");
        ReminderRepository mRepository; = new ReminderRepository(context);
        List<Reminder> list = mRepository.getAllReminder();
        for(Reminder r : list) {
                // TODO
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案 2:允许在主线程上进行查询。构建数据库时,使用 allowMainThreadQueries() 允许在主线程上进行查询。

!!!! 注意力 !!!!不建议 !!!!注意力 !!!!