Android Room持久性库@Update不工作
我试图通过新的android room库更新我的数据库,但它不起作用。这就是我的方法Android Room持久性库@Update不工作,android,database,sqlite,sql-update,android-room,Android,Database,Sqlite,Sql Update,Android Room,我试图通过新的android room库更新我的数据库,但它不起作用。这就是我的方法 @IgnoreExtraProperties @Entity(tableName = CarModel.TABLE_NAME, indices = {@Index(value = "car_name", unique = true)}) public class CarModel { public static final String TABLE_NAME = "cars"; @P
@IgnoreExtraProperties
@Entity(tableName = CarModel.TABLE_NAME,
indices = {@Index(value = "car_name", unique = true)})
public class CarModel {
public static final String TABLE_NAME = "cars";
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "car_name")
private String name;
@ColumnInfo(name = "car_price")
private String price;
private String type;
private String position;
}
MainActivity.java
viewModel.isCarsEmpty().observe(MainActivity.this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer rowCount) {
if (rowCount == 0) {
viewModel.insertItems(list);
} else {
viewModel.updateItems(list);
}
}
});
viewModel.isCarsEmpty().observe(MainActivity.this,new Observator()){
@凌驾
公共void onChanged(@Nullable Integer rowCount){
如果(行计数==0){
viewModel.insertItems(列表);
}否则{
viewModel.updateItems(列表);
}
}
});
CarViewModel.java
public LiveData<Integer> isCarsEmpty() {
return appDatabase.carDao().isDbEmpty();
}
public void insertItems(List<CarModel> carModels) {
new insertCarsAsyncTask(appDatabase).execute(carModels);
}
private class insertCarsAsyncTask extends AsyncTask<List<CarModel>, Void, Void> {
private AppDatabase db;
public insertCarsAsyncTask(AppDatabase appDatabase) {
db = appDatabase;
}
@Override
protected Void doInBackground(List<CarModel>... params) {
db.carDao().insertCars(params[0]);
return null;
}
}
public void updateItems(List<CarModel> list) {
new updateCarsTask(appDatabase).execute(list);
}
private class updateCarsTask extends AsyncTask<List<CarModel>, Void, Void> {
private AppDatabase db;
public updateCarsTask(AppDatabase appDatabase) {
db = appDatabase;
}
@Override
protected Void doInBackground(List<CarModel>... params) {
db.carDao().updateCars(params[0]);
return null;
}
}
public-LiveData-iscarsmempty(){
返回appDatabase.carDao().isDbEmpty();
}
公共void插入项(列表carModels){
新建insertCarsAsyncTask(appDatabase).execute(carModels);
}
私有类insertCarsAsyncTask扩展了AsyncTask{
私有数据库;
公共insertCarsAsyncTask(AppDatabase AppDatabase){
db=appDatabase;
}
@凌驾
受保护的Void doInBackground(列表…参数){
db.carDao().insertCars(参数[0]);
返回null;
}
}
公共无效更新项(列表){
新建updateCarsTask(appDatabase).execute(list);
}
私有类updateCarsTask扩展了AsyncTask{
私有数据库;
公共updateCarsTask(AppDatabase AppDatabase){
db=appDatabase;
}
@凌驾
受保护的Void doInBackground(列表…参数){
db.carDao().updateCars(参数[0]);
返回null;
}
}
java
@Insert(onConflict = REPLACE)
void insertCars(List<CarModel> cars);
@Update
void updateCars(List<CarModel> param);
@Query("SELECT count(*) FROM " + CarModel.TABLE_NAME)
LiveData<Integer> isDbEmpty();
@Insert(onConflict=REPLACE)
作废插入卡(列出车辆);
@更新
作废更新卡(列表参数);
@查询(“从”+CarModel.TABLE_名称中选择计数(*))
LiveData是空的();
我做了调试,新数据来了,并调用viewModel.updateItems(list)方法。提前谢谢 我很抱歉将此作为答案发布,但我还不能添加简单的评论,因此我的想法如下: 您是否尝试过仅使用
insertCars()
而不是updateCars()
?
无论如何,看起来您的
iscarsmempty()
LiveData回调始终被触发,因为调用观察者时,数据库再次被更改。。我不太确定您想要完成什么。确保要更新的行和要发送更新的模型的id应与您定义为主键的id相同。更新意味着您获取数据库中已存在的CarModel
,更新此CarModel
后返回新的值,但返回相同Id的Id除外
怎么办
例如,您需要一个类型为CarModel
的全局变量,并在CarModel
在MainActivity中,将获取的CarModel分配给全局变量,并使用set函数更新CarModel成员变量的值
然后将此全局变量传递给MainActivity中的update函数
我在好主意中举了个例子,只有insertCars()实现了我想要的技巧。再次感谢。很高兴我能提供帮助:)我在将insert与
onConflict=OnConflictStrategy一起使用时遇到问题。请替换,并且实体具有“@PrimaryKey(autoGenerate=true)”,该条目是用新id插入的,而不是用相同id更新条目。有什么建议吗?@etomun如果设置autoGenerate=true
,则必须首先获取要更新的实体,然后使用该实体的id来构建新实体。@etomun在autoGenerate=true
的情况下,是的。