房间更新未更新数据库

3

我是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;
}

Dao:

@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个回答

3
你可以这样做:
  1. 数据库中获取要更新的项;
  2. 通过设置setter方法来更新具有CheckInStatus的POJO
  3. 简单地使用@Update(onConflict = OnConflictStrategy.REPLACE)函数,并将更新后的POJO传递给它(因为Id匹配并且是主键数据库将自动识别此情况并更新所需对象的所有必需字段);
@Override
protected Void doInBackground(Void... voids) {
    Appointment entity = mAsyncTaskDao.getAppointmentById(mId);
    entity.setCheckInStatus(true);
    mAsyncTaskDao.update(entity);
    return null;
}

That is it :) Good luck.


1
我非常感谢这个答案。我之前已经做了所有的事情,但是我忘记了asynctask的一个非常重要的部分。你必须在它上面调用.execute(),否则它就不会执行。撞头到桌子上。 - Energy CJ
嗯,那很有趣 :D - Tomas Jablonskis
@TomasJablonskis 我尝试以这种方式操作,但是它给了我唯一约束失败的错误。 - shahooo
@ShahuRonghe,你的数据库表可能添加了唯一约束。为了解决这个问题,你应该使用OnConflictStrategy,像这样:@Update(onConflict = OnConflictStrategy.REPLACE),如果它发现要更新的对象的数据与已有数据相同/冲突(取决于你的唯一约束),它将替换该对象的数据。 - Tomas Jablonskis
@Update(onConflict = OnConflictStrategy.REPLACE) 这对我很有效。 - Mohd Qasim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接