Room Update未更新数据库

时间:2018-08-09 15:34:42

标签: android android-room

我是Room的新手,在更新数据库时遇到了一些麻烦。插入和删除工作按预期的方式进行,但更新不进行。数据在数据库中保持不变。我尝试使用整个对象和@Query语句中的特定字段进行更新。我在做什么错了?

实体:

@Entity(tableName = "Appointments")
public class Appointment {

@PrimaryKey
@NonNull
public int AppointmentID;
public Boolean CheckInStatus;

public Appointment(
        @NonNull int AppointmentID,
        Boolean CheckInStatus
) {

    this.AppointmentID = AppointmentID;
    this.CheckInStatus = CheckInStatus;

}

public void setCheckInStatus(Boolean checkInStatus) {
    CheckInStatus = checkInStatus;
}

@NonNull
public int getAppointmentID() {
    return this.AppointmentID;
}

public Boolean getCheckInStatus() {
    return CheckInStatus;
}

public void setID(@NonNull int AppointmentID) {
    this.AppointmentID = AppointmentID;
}

道:

@Update
void update(Appointment appointment);

@Query("UPDATE Appointments SET CheckInStatus = 1 WHERE AppointmentID = :Id")
void updateCheckIn(int Id);

回购:

public void updateCheckIn(int Id) {
    new AppointmentRepository.updateCheckInAsyncTask(mAppointmentDao, Id);
}

public static class updateCheckInAsyncTask extends AsyncTask<Void, Void, Void> {

    private AppointmentDao mAsyncTaskDao;
    private int mId;

    updateCheckInAsyncTask(AppointmentDao dao, int Id) {

        mAsyncTaskDao = dao;
        mId = Id;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        mAsyncTaskDao.updateCheckIn(mId);
        return null;
    }
}

public void update(Appointment appointment) {
    new AppointmentRepository.updateAsyncTask(mAppointmentDao, appointment);
}

private static class updateAsyncTask extends AsyncTask<Void, Void, Void> {

    private AppointmentDao mAsyncTaskDao;
    private Appointment mAppointment;

    updateAsyncTask(AppointmentDao dao, Appointment appointment) {

        mAsyncTaskDao = dao;
        mAppointment = appointment;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        mAsyncTaskDao.update(mAppointment);
        return null;
    }
}

查看模型:

public void update(Appointment appointment) { mRepository.update(appointment); }

public void updateCheckIn(int Id) { mRepository.updateCheckIn(Id); }

活动:

// Update check in status in table
mAppointmentVM.updateCheckIn(mId);

当我走那条路线时,正确的id和更新的对象一样被传递。非常感谢您的协助。

编辑: 最终答案是:

   public void updateCheckIn(int Id) {
    new AppointmentRepository.updateCheckInAsyncTask(mAppointmentDao, Id).execute();
}

public static class updateCheckInAsyncTask extends AsyncTask<Void, Void, Void> {

    private AppointmentDao mAsyncTaskDao;
    private int mId;

    updateCheckInAsyncTask(AppointmentDao dao, int Id) {

        mAsyncTaskDao = dao;
        mId = Id;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        Appointment entity = mAsyncTaskDao.getAppointmentDetails(mId);
        entity.setCheckInStatus(true);
        mAsyncTaskDao.update(entity);
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以简单地这样做:

  1. 数据库获取要更新的项目;
  2. 通过使用setter方法设置CheckInStatus来更新 POJO
  3. 只需使用@Update函数并将更新后的 POJO 传递给它(因为ID的匹配及其主键 DB 会自动识别这种情况并更新必需对象的所有必需字段);


示例:

@Override
protected Void doInBackground(Void... voids) {
    Appointment entity = mAsyncTaskDao.getAppointmentById(mId);
    entity.setCheckInStatus(true);
    mAsyncTaskDao.update(entity);
    return null;
}

就是这样:)祝你好运。