Как получить доступ к БД комнаты в Work Manager для периодической синхронизации? - PullRequest
1 голос
/ 03 апреля 2019

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

Вот мой код: -

//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 Ответ

0 голосов
/ 03 апреля 2019

Если вы создаете запрос в своем работнике, то, возможно, вы захотите отправить строку с именем вашей таблицы. Как выглядит твой работник?

...