我在Android项目中使用GreenDAO。
我已实施增量更改表,因此我可以跟踪实体的各个更新。我想在一个单独的" updateTask"中跟踪这些变化。方法,所以无论从哪里调用,delta表都可以更新。
目前,我有一个方法可以更改任务实体的状态。
public void updateTaskStatus (Long taskId, String status) {
Task task = taskDao.load(taskId);
task.setStatus("Pending");
updateTask(task);
}
然后我有了我的任务更新方法。
public void updateTask (Task task) {
//Check for any changes to the Task entity in this method and update the delta table.
Task existingTask = taskDao.load(task.getId()); // <---this call returns the same reference to the task object that was passed into this method.
if (!existingTask.getStatus().equals(task.getStatus())) { //<--this is always returning false as both existingTask and task point to the same Task instance, but I want a fresh one and my current one. My problem is here!
//update delta table here with status change entry.
}
taskDao.update(task);
}
我的问题是,从taskDao加载任务时,始终返回相同的引用。 因此,当我第一次加载Task并设置状态时,然后将其传递给updateTask方法,并在那里我尝试从数据库加载一个新的副本进行比较,它实际上返回相同的引用。所以我的 if(!existingTask.getStatus()。equals(task.getStatus()))语句总是返回false,因为两个引用的值都是相同的。
如果我尝试调用taskDao.refresh(existingTask),它再次没有帮助,两个引用都指向同一个Task实例。
如何从greenDao获取我的Task实体的新副本,而不会影响内存中的&#34;#34; ?
希望你能理解我的问题。
答案 0 :(得分:4)
我明白了。在再次获取之前,我只需将我的实体从会话中分离出来。
public void updateTask (Task task) {
//Check for any changes to the Task entity in this method and update the delta table.
**taskDao.detach(task); // <--added this line of code**
Task existingTask = taskDao.load(task.getId());
if (!existingTask.getStatus().equals(task.getStatus())) {
//update delta table here with status change entry.
}
taskDao.update(task);
}