如何将数据对象从Room DB传递到WorkManager类

时间:2019-01-12 09:49:06

标签: android android-room android-architecture-components android-database android-workmanager

存在将对象保存到Room数据库的对话框。该对话框应等待保存到数据库,以便运行特殊的Worker类,该类将通过ID从数据库中检索此对象并对其进行一些处理。

但这需要使用同步代码,该代码是Room中的反模式。我决定最好的选择是运行WorkManager,它将对象保存到数据库,然后在整个链中运行特殊的Worker类。但是问题是我无法传递仅保存为基本类型的对象来保存在Data.Builder中。 JSON中仅保留序列化变体。是否可以不进行序列化?毕竟,从理论上讲,序列化JSON的大小可以超过10240 bytes的限制。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您需要通过引用来传递它们。因此,如果您有一个会议室Entity,请抓住它的密钥/ ID,然后使用Worker中的setInputData将其作为输入传递给{OneTime|Periodic}WorkRequest.Builder,然后可以查询实际的Entity实施中的Worker室。

答案 1 :(得分:0)

如本回答中所述here

您需要通过引用传递它们。因此,如果您有一个 Room 实体,通过在 {OneTime|Periodic}WorkRequest.Builder 中使用 setInputData 获取其键 / id 并将其作为输入传递给 Worker,然后您可以在 Worker 的实现中查询实际的 Room 实体。

就我而言,我使用它从数据库中获取值并执行任务,但原理相同。

new_line = stripped_line.replace("x=msgbox(, 0+, )", "x=msgbox"(box, "0+", boxerro, boxtitle))
SyntaxWarning: 'str' object is not callable; perhaps you missed a comma? 

为工作经理创建一个工作请求来完成您的任务

  @Override
    public Result doWork() {

    final Context applicationContext = getApplicationContext();

    try {

        final String title = getInputData().getString(Constants.TITLE);
        final String msg = getInputData().getString(Constants.MESSAGE);

        final int id = getInputData().getInt(Constants.ID,0);


        Executor myExecutor = Executors.newSingleThreadExecutor();
        myExecutor.execute(new Runnable() {
            @Override
            public void run() {
                Entity entity =  BasicApp.getInstance().getDatabase().entityDao().getEntity(id);

                Timber.tag(TAG).d( "id for Entity %s", entity.getId());

                Utils.doMyTask(new String[] {title, msg}, id, applicationContext);
            }
        });

        return Result.success();

    } catch (Throwable throwable) {
        // Technically WorkManager will return Result.failure()
        // but it's best to be explicit about it.
        // Thus if there were errors, we're return FAILURE
        Timber.tag(TAG).e(throwable, "Error scheduling notification");

        return Result.failure();
    }

}

创建一个包含值的输入数据包 @return 包含值详细信息的数据

    public void do my task(long delay) {

       OneTimeWorkRequest request =
               new OneTimeWorkRequest.Builder(MyWorker.class)
                       .setInputData(createInputData())
                       .setInitialDelay(delay, TimeUnit.MILLISECONDS)
                       .addTag(Constants.MY_WORK_NAME)
                       .build();

       mWorkManager.enqueue(request);

}