Android BroadcastReceiver数据库访问与房间

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android BroadcastReceiver数据库访问与房间相关的知识,希望能为你提供帮助。
我已经设置了一个闹钟,每小时都会拨打一个广播接收器。此接收器尝试从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); }

答案我找到了两个可能的问题答案。
解决方案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 } } }

解决方案2:允许在主线程上进行查询。构建数据库时,使用allowMainThreadQueries()允许在主线程上进行查询。
【Android BroadcastReceiver数据库访问与房间】!!!!注意!!!!不建议 !!!!注意!!!!

    推荐阅读