Android 房间持久性库 @Update 不工作

Android Room persistence library @Update not working

我正在尝试通过新的 android 房间库更新我的数据库,但它不起作用。这是我的方法

@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);
                        }
                    }
                });

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

CarDao.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();

我调试了,新数据来了,提前调用了viewModel.updateItems(list)method.Thanks!

很抱歉将此作为答案发布,但我还不允许添加简单的评论,所以这是我的想法:

您是否尝试过只使用 insertCars() 而不是 updateCars()? 无论如何,看起来你的 isCarsEmpty() LiveData 回调一直被触发,因为当调用观察者时,数据库又被改变了。我不太确定你想要完成什么。

确保您要更新的行和您发送到更新的模型应该具有与您定义为主键相同的 ID。

更新意味着您获取数据库中已经存在的 CarModel,并且在更新此 CarModel 之后,您 return 数据库的新值,除了您 return相同的Id

做什么

例如,您需要一个 CarModel 类型的全局变量并在 CarModel

中实现集合函数

在MainActivity中将获取的CarModel赋值给全局变量,并使用set函数更新CarModel成员变量的值

然后将这个全局变量传递给MainActivity中的update函数

我在my Github like this

中有示例