Доступ к базе данных Android BroadcastReceiver с помощью комнаты - PullRequest
0 голосов
/ 30 августа 2018

Я установил будильник, который каждый час вызывает приемник вещания. Этот получатель пытается загрузить данные из базы данных 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 Ответ

0 голосов
/ 31 августа 2018

Я нашел два возможных ответа на мой вопрос.

Решение 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 (), чтобы разрешить запросы в основном потоке.

!!!! ВНИМАНИЕ !!!! НЕ РЕКОМЕНДУЕТСЯ !!!! ВНИМАНИЕ !!!!

...