Android Room持久性库@Update无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Room持久性库@Update无效相关的知识,希望对你有一定的参考价值。

我试图通过新的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;
}

main activity.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);
                        }
                    }
                });

car view model.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;
    }
}

card奥.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)方法。提前谢谢!

答案

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

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

另一答案

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

以上是关于Android Room持久性库@Update无效的主要内容,如果未能解决你的问题,请参考以下文章

Android中Room 持久性库使用

SQlite 数据库 VS Room 持久性库 [关闭]

有人可以帮助我更好地理解 Room 持久性库吗?

更新android Room中实体的某些特定字段

Android Room:查询中的每个绑定变量都必须有一个匹配的方法

Android Room 编译时警告外​​键中的列不属于索引。这是啥意思?