房间更新不更新数据库
Room Update not Updating Database
我是 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); }
Activity:
// 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;
}
}
你可以简单地这样做:
- 从 DB;
中获取要更新的项目
- 通过使用 setter 方法设置 CheckInStatus 来更新 POJO;
- 只需使用
@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;
}
就是这样:)祝你好运。
我是 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); }
Activity:
// 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;
}
}
你可以简单地这样做:
- 从 DB; 中获取要更新的项目
- 通过使用 setter 方法设置 CheckInStatus 来更新 POJO;
- 只需使用
@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;
}
就是这样:)祝你好运。