GreenDAO:从数据库中检索新实体以与更改的实体进行比较

时间:2014-06-30 10:08:03

标签: greendao

我在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; ?

希望你能理解我的问题。

1 个答案:

答案 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);

}