Исключение IllegalStateException при создании напоминаний с помощью Room и AlarmManager

#java #android #android-studio

Вопрос:

Я разрабатываю приложение, которое планирует напоминания (уведомления и / или сигналы тревоги) с помощью AlarmManager, поскольку пользователь может создавать большое количество напоминаний, я решил, что, когда пользователь добавляет напоминание, оно не должно быть запланировано с помощью AlarmManager, а добавлено в базу данных SQLite и добавлено в AlarmManager в день, когда оно должно зазвонить, я использовал это приложение.:

     Intent intent = new Intent(context, AlarmReceiver.class);
        intent.setAction("ACTIVATOR");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarm.cancel(pendingIntent);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cHoraActivacion.getTimeInMillis(), (24 * 60 * 60 * 1000), pendingIntent);
 

Это заставит «АКТИВАТОР» активироваться каждый день в 00:00, чтобы активировать напоминания о дне с помощью AlarmManager:

     @Override
    public void onReceive(Context context, Intent intent) {
    if (appDataBase == null){
        appDataBase = Room.databaseBuilder(context, AppDataBase.class, Constant.DB_NAME)
                .allowMainThreadQueries()
                .build();
    }

    String action = intent.getAction();
    if (action != null amp;amp; context != null) {
        if("ACTIVATOR".equals(action)) {
            activateDayAlarm(context);
            activateClassOfDayReminders(context, appDataBase);
            activateDayScheduleReminders(context, appDataBase);
        }
 

На Samsung J2 с Android 8.1 это работает нормально, но вот что показывает мне PlayConsole:

     java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:4452)
  at android.app.ActivityThread.access$1600 (ActivityThread.java:301)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2159)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:8506)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
Caused by: java.lang.IllegalStateException: 
  at androidx.room.RoomOpenHelper.onUpgrade (RoomOpenHelper.java:117)
  at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade (FrameworkSQLiteOpenHelper.java:177)
  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:489)
  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:387)
  at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:145)
  at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase (FrameworkSQLiteOpenHelper.java:106)
  at androidx.room.RoomDatabase.inTransaction (RoomDatabase.java:476)
  at androidx.room.RoomDatabase.assertNotSuspendingTransaction (RoomDatabase.java:281)
  at com.package.name.crud.ReminderDao_Impl.listIdsRemindersOfDay (ReminderDao_Impl.java:270)
  at com.package.name.AlarmReceiver.activateDayScheduleReminders (AlarmReceiver.java:360)
  at com.package.name.AlarmReceiver.onReceive (AlarmReceiver.java:65)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:4443)
 

Вчера я загрузил обновление, и оно произошло с 26 пользователями (Android 8, 8.1, 9, 10, 11)

В тревожном получателе:

 static void activateDayScheduleReminders(Context context, AppDataBase appDataBase){
    long idSemester = MySettings.getCurrentSemester(context);
    String hour = new SimpleDateFormat("HH:mm").format(new Date());
    List<Integer> idsRemindersOfDay = appDataBase.reminderDao().listIdsRemindersOfDay(idSemester, dateToday(), hour);
    for (int i = 0; i < idsRemindersOfDay.size(); i  ){
        int idReminder = idsRemindersOfDay.get(i);
        String[] hourReminder = appDataBase.reminderDao().getHourReminder(idReminder).split(":");
        int hourR = Integer.parseInt(hourReminder[0]);
        int minuteR = Integer.parseInt(hourReminder[1]);
        Calendar cDateReminder = Calendar.getInstance();
        cDateReminder.set(Calendar.HOUR_OF_DAY, hourR);
        cDateReminder.set(Calendar.MINUTE, minuteR);
        cDateReminder.set(Calendar.SECOND, 0);
        cDateReminder.set(Calendar.MILLISECOND, 0);
        if (cDateReminder.after(Calendar.getInstance()))
            NotificationScheduler.setScheduleReminder(context, idReminder, cDateReminder);
    }
}
 

360 line is:

 List<Integer> idsRemindersOfDay = appDataBase.reminderDao().listIdsRemindersOfDay(idSemester, dateToday(), hour);
 

In ReminderDao

 @Query("SELECT Reminder._id FROM Remindern"  
        "INNER JOIN Event ON Reminder.id_event_rc=Event._idn"  
        "INNER JOIN Semester ON Event.id_semester_ev=Semester._idn"  
        "WHERE Semester._id=:idSemestern"  
        "AND Reminder.date = :daten"  
        "AND Reminder.hour>=:hourn"  
        "ORDER BY Reminder.hour")
List<Integer> listIdsRemindersOfDay(long idSemester, String date, String hour);
 

dateToday():

 static String dateToday(){
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    return dateFormat.format(date);
}
 

I have investigated but I can not find the problem, I hope you can help me