【Android Room持久性库@Update无效】须知少年凌云志,曾许人间第一流。这篇文章主要讲述Android Room持久性库@Update无效相关的知识,希望能为你提供帮助。
我试图通过新的android房间库更新我的数据库,但它无法正常工作。这是我的方法
@IgnoreExtraProperties
@Entity(tableName = CarModel.TABLE_NAME,
indices = {@Index(value = "https://www.songbingjia.com/android/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。
推荐阅读
- JNI C ++ android app在调用函数时崩溃
- 如何更改Android中的汉堡包图标(导航抽屉)
- 如何从android API 23和更高版本的操作栏中删除阴影
- 在动作栏android中显示徽标和应用程序名称
- Android棒棒糖中的透明actionBar和statusBar
- Xamarin - 取代操作栏(Android 7.1 - API 25)
- android中的pidstat命令()
- 如何在android中实现视图滑动
- java.lang.NoClassDefFoundError(解析失败:Lcom / google / android / gms / common / internal / zzbp)