Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Room持久性库@Update不工作_Android_Database_Sqlite_Sql Update_Android Room - Fatal编程技术网

Android Room持久性库@Update不工作

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

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

    @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
的情况下,是的。