当前位置: 首页 > 知识库问答 >
问题:

Android Room持久性库@Update不工作

慕弘伟
2023-03-14

我试图通过新的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)方法。提前谢谢!

共有3个答案

华建同
2023-03-14

更新意味着您获取数据库中已存在的CarModel,更新此CarModel后,您将新值返回数据库,但返回相同Id的Id除外

怎么办

例如,您需要一个类型为CarModel的全局变量,并在CarModel中实现set函数

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

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

我的Github中有这样的例子

明安阳
2023-03-14

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

您是否尝试过只使用插入汽车()而不是updateCars()?无论如何,它看起来像你的isCarsAir ty()LiveData回调会被触发,因为当观察者被调用时,数据库会再次被更改。.我不太确定你想完成什么。

澹台华翰
2023-03-14

确保要更新的行和要发送更新的模型具有与您定义为主键的相同的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