自动更新新插入的房间实体中的主键

时间:2019-07-06 14:03:10

标签: java android android-room android-jetpack

当您在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范式中可接受的解决方案吗?你呢 看到任何陷阱吗?

1 个答案:

答案 0 :(得分:1)

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

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