存在将对象保存到Room
数据库的对话框。该对话框应等待保存到数据库,以便运行特殊的Worker
类,该类将通过ID从数据库中检索此对象并对其进行一些处理。
但这需要使用同步代码,该代码是Room
中的反模式。我决定最好的选择是运行WorkManager
,它将对象保存到数据库,然后在整个链中运行特殊的Worker
类。但是问题是我无法传递仅保存为基本类型的对象来保存在Data.Builder
中。 JSON中仅保留序列化变体。是否可以不进行序列化?毕竟,从理论上讲,序列化JSON的大小可以超过10240 bytes
的限制。
任何帮助将不胜感激!
答案 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);
}