Как получить доступ к базе данных room в Work Manager для периодической синхронизации?

#android #mvvm #android-room #android-architecture-components #android-workmanager

#Android #mvvm #android-room #android-архитектура-компоненты #android-workmanager

Вопрос:

Я хочу периодически синхронизировать базу данных Room. Для этого я использую work Manager. Я создал периодический запрос на работу и хочу отправить таблицу с setInputData(TABLE HERE..) . Я хочу знать, правильно ли я это делаю. И если правильно, как я могу периодически отправлять таблицу в work Manager? Если это не так, пожалуйста, помогите мне с подходящим решением.

Вот мой код:

 //schedule recurring task only once
//Fragment
    if(!SessionManager.getBoolenFromPreferences(getActivity(),REFRESH_ATTENDANCE)){
        attendanceViewModel.setupPeriodicRefreshWork();
        SessionManager.putBoolenInPreferences(getActivity(), true, REFRESH_ATTENDANCE);
    }

//view model
public void setupPeriodicRefreshWork() {
    AttendanceScheduler.refreshWork();
}

//Scheduler
public static void refreshWork() {

    //define constraints
    Constraints myConstraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

  //How to Set Data Here ?
    Data source = new Data.Builder()
            .put(HERE)
            .build();

    PeriodicWorkRequest refreshWork =
            new PeriodicWorkRequest.Builder(AttendanceWorker.class, 1, TimeUnit.HOURS)
                    .setConstraints(myConstraints)
                    .setInputData(source)
                    .build();

    WorkManager.getInstance().enqueue(refreshWork);
}
  

Вот мой рабочий код:

 public class AttendanceWorker extends Worker {

    private Executor executor;
    private static final String TAG = "AttendanceWorker";

    public AttendanceWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        executor = Executors.newSingleThreadExecutor();
    }


    @SuppressLint("CheckResult")
    @NonNull
    @Override
    public Result doWork() {
        Context context = getApplicationContext();
        AttendanceDao attendanceDao = DatabaseInstance.getInstance(context).attendanceDao();
        Attendance attendance = attendanceDao.getAttendanceDetailsForSync();
        NetworkUtils.getAPIService().saveAttendanceDetails(attendance).compose(RxUtils.applySchedulers())
                .subscribe(
                        (AttendanceResponse attendanceResponse) -> executor.execute(() ->
                        {
                            if (attendanceResponse != null) {
                                if (attendanceResponse.getResult().equals("1")) {
                                    Log.d(TAG, "Attendance Synced!");
                                }
                            }
                        }),
                        Throwable::printStackTrace
                );
        return Result.success();
    }

}
  

Комментарии:

1. Можете ли вы предоставить свой AttendanceWorker код?

2. Привет @JeelVankhede Я еще не написал код. Но, как только я узнаю, как я могу получить доступ к моей таблице базы данных. я создам post-запрос в рабочем классе.

3. Хорошо, тогда вы можете сделать одну вещь, это принять некоторый условный параметр, который определяет, с какой таблицей вы хотите взаимодействовать, а затем внутри вашего рабочего doWork() метода у вас будет ApplicationContext для подключения к вашей базе данных, а затем получить ваш условный параметр в качестве входных данных и выполнить работу, предназначенную для условий.

4. Контекст context = getApplicationContext(); AttendanceDao attendanceDao = DatabaseInstance.getInstance(контекст).attendanceDao(); Посещаемость attendance = attendanceDao.getAttendanceDetails().GetValue(); GetValue() возвращает значение null. Я знаю, что его нужно запрашивать асинхронно. Итак, как я могу получить доступ к таблице db?

5. Решил это. Создал еще один метод в DAO, аналогичный предыдущему, но вместо LiveData<Object> я вернул обычный объект и получил таблицу с attendanceDao.getAttendanceDetailsForSync(); Добавил рабочий код выше.