我试图通过新的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;
}
主要活动。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;
}
}
卡ao.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)方法。提前谢谢!
更新意味着您获取数据库中已存在的CarModel
,更新此CarModel
后,您将新值返回数据库,但返回相同Id的Id除外
怎么办
例如,您需要一个类型为CarModel
的全局变量,并在CarModel
中实现set函数
在MainActivity中,将获取的CarModel分配给全局变量,并使用set函数更新CarModel成员变量的值
然后将此全局变量传递给MainActivity中的update函数
我的Github中有这样的例子
我很抱歉把这个作为一个答案,但我不允许添加一个简单的评论,所以这是我的想法:
您是否尝试过只使用插入汽车()
而不是updateCars()
?无论如何,它看起来像你的isCarsAir ty()
LiveData回调会被触发,因为当观察者被调用时,数据库会再次被更改。.我不太确定你想完成什么。
确保要更新的行和要发送更新的模型具有与您定义为主键的相同的id。
下面是Kotlin中的类: 但当我试图运行应用程序时,它立即崩溃。以下是崩溃日志: 类似乎不是自动生成的。我检查了从codelab下载的原始java应用程序,发现是自动生成的。
Android的Room持久性库优雅地包含了适用于对象或集合的@Insert和@Update注释。但是,我有一个用例(包含模型的推送通知),它需要UPSERT,因为数据库中可能存在数据,也可能不存在数据。 Sqlite本机不具有up,在这个SO问题中描述了解决方法。鉴于那里的解决方案,如何将它们应用于Room? 更具体地说,如何在房间中实现插入或更新,而不破坏任何外键约束?使用insert wit
我正在使用网络逻辑10.3。我正在尝试配置一个持久订阅,其中包含由 jdbc 存储(在 Oracle DB 中)支持的持久消息。我有一个主题,MDB 正在作为持久订阅者侦听该主题。在场景-1下:如果我发送消息,它会命中MDB。 在场景2中:我挂起了MDB,希望发送到主题的消息只要不被MDB(它是唯一注册的持久订阅者)使用,就会一直存在。但是当我向主题发送消息时,它短暂地出现在那里,然后就消失了(我
我使用springboot(2.1.9。RELEASE)和hibernate(5.4.6。最终)来开发程序,我需要懒加载一个字符串类型字段(更改日志),所以我使用了持久性属性截取表,字符串类型字段可以懒加载,但是ManyTo很多的连接表不起作用。这是代码 测试用例代码 运行测试用例后,数据被插入到类别和项目表中,但是joinTablecategory_items没有数据。如果项目不使用持久性属性属
问题内容: 我正在使用一个简单的PHP库通过HTTP将文档添加到SOLR索引中。 目前涉及3台服务器: 运行索引工作的PHP框 一个数据库框,其中包含要建立索引的数据 solr框。 以每秒80个文档(每秒100万文档)的速度,我注意到PHP和solr盒上的网络接口的中断率异常高(2000 / sec;此外,图形几乎相同- 当中断时率在PHP框上达到峰值,在Solr框上也达到峰值),但在数据库框上却
EJB 3.0,EJB 2.0中使用的实体bean在很大程度上被持久性机制所取代。 现在,实体bean是一个简单的POJO,它具有与表的映射。 以下是持久性API中的关键角色 - Entity - 表示数据存储记录的持久对象。 可序列化是件好事。 EntityManager - 持久性接口,用于对持久对象(实体)执行添加/删除/更新/查找等数据操作。 它还有助于使用Query接口执行查询。 Per