【问题标题】:Automatically updating primary key in newly inserted Room Entity自动更新新插入的房间实体中的主键
【发布时间】:2019-11-16 18:46:30
【问题描述】:

当您在 Room 中添加新创建的对象时,会自动生成 主键,新创建的对象保持未定义的主键。这 当您需要修改此对象并保留 变化。

举个例子吧。

实体道

所以,让我们创建一个User,其id 是自动生成的。

@Entity()
public class User {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int id;

    @ColumnInfo(name = "email")
    private String email;

    public User(String email) {
        this.email = email;
    }

    // Other methods, especially getter and setter for each field

    // …
}

我们有以下道:

public class UserDao {
    @Insert
    void insert(User user);

    @Update
    int update(User user);

    // …
}

我们通过以下存储库进行交互:

public class Repository {
    private UserDao userDao;

    public void addUser(User user) {
        userDao.insert(user);
    }

    public void update(User user) {
        userDao.update(user);
    }

    // …
}

插入和更新实体

所以,现在如果我们这样做,user 将不会更新,因为User.id 将保持为 0 并且 Update 注释 updates the row only if the primary key already exists

Repository r = new Repository();
User user = new User("me@my.email");
r.addUser(user);
user.setEmail("new@user.email");

建议的解决方案

为了解决这个问题,我们可以更改RepositoryaddUser 方法以在插入后更新id。 This question 给了我以下想法:

public class Repository {
    private UserDao userDao;

    public void addUser(User user) {
        long rowid = userDao.insert(user);
        user.setId(userDao.getIdFromRowid(rowid));
    }

    // …
}

有了这个 Dao(注意 insert 返回一个 long 而不是 void):

public class UserDao {
    @Insert
    long insert(User user);

    @Update
    int update(User user);

    @Query("SELECT id FROM user WHERE ROWID = :rowid")
    int getIdFromRowid(long rowid);

    // …
}

这是否是 Android Jetpack 范例中可接受的解决方案?你 发现任何陷阱?

【问题讨论】:

    标签: java android android-room android-jetpack


    【解决方案1】:

    您提出的解决方案是可以接受的,您可以从 Room DB 获取插入的 id,然后将其设置回您的对象引用。所以你可以执行更新和删除操作。另一个认为您可以探索和使用的是 LiveData on Select 查询,它会在 Room DB 中发生更改时为您提供回调中的更新数据。但是,这取决于您的逻辑。 示例:

    @Query("SELECT * from test_tbl")
     LiveData<List<Model>> getTestData();  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2019-03-26
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多