【发布时间】: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");
建议的解决方案
为了解决这个问题,我们可以更改Repository 的addUser 方法以在插入后更新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