当您在Room中添加新创建的对象时,会自动生成 主键,新创建的对象将保留其未定义的主键。这个 当您需要修改该对象并保持 变化。
让我们举个例子。
因此,让我们创建一个resourceId('Microsoft.ApiManagement/service/groups', 'ApiManagementName', 'Developer')
,该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
将保持为0,而User.id
注释为updates the row only if the primary key already exists。
Update
为解决此问题,我们可以更改Repository r = new Repository();
User user = new User("me@my.email");
r.addUser(user);
user.setEmail("new@user.email");
的{{1}}方法以在插入后更新id。
This question给了我以下主意:
addUser
使用此Dao(请注意,Repository
返回public class Repository {
private UserDao userDao;
public void addUser(User user) {
long rowid = userDao.insert(user);
user.setId(userDao.getIdFromRowid(rowid));
}
// …
}
而不是insert
):
long
这是Android Jetpack范式中可接受的解决方案吗?你呢 看到任何陷阱吗?
答案 0 :(得分:1)
您提出的解决方案是可以接受的,您可以从Room DB获取插入的ID,然后将其设置回您的对象引用。因此,您可以执行更新和删除操作。另一个认为您可以浏览和使用的方法是Select查询中的LiveData,它可以在Room DB中更改数据时在回调中提供更新数据。但是,这取决于您的逻辑。 示例:
@Query("SELECT * from test_tbl")
LiveData<List<Model>> getTestData();