【问题标题】:Room Update not Updating Database房间更新不更新数据库
【发布时间】:2019-01-17 03:40:21
【问题描述】:

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

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    你可以这样做:

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

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

    就是这样 :) 祝你好运。

    【讨论】:

    • 非常感谢您的回答。我以前做过所有这些,但我忘记了异步任务的一个非常重要的部分。你必须调用它 .execute() 否则它不会......执行。砰的一声撞到桌子上。
    • 嗯,那是...有趣:D
    • @TomasJablonskis 我试过这样做,但它给我的唯一约束失败了
    • @ShahuRonghe 您可能在数据库表中添加了唯一约束。要解决此问题,您应该像这样使用 OnConflictStrategy:@Update(onConflict = OnConflictStrategy.REPLACE),如果发现此对象的数据相同/冲突,它将替换您要更新的对象的数据,具体取决于你那些独特的限制。
    • @Update(onConflict = OnConflictStrategy.REPLACE) 这对我有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2020-04-14
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多