在数据库中使用自己的对象的房间(实体中的子实体)

本斯克

我一直在研究这样的时间,以找出解决该问题的最佳方法。假设我想将一个实体放入另一个实体

@Entity(tableName = "user")
public class User {

   @PrimaryKey(autoGenerate = true)
   private Long id;

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

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


   //getters & setters
}

ORMLite支持将自己的对象(实体)存储到另一个实体中,并且还包含在一个表中(不像Room中的@Embedded)。但是我发现会议室不支持这样的功能。因此,我的解决方案是将该实体的ID添加到目标实体。(下面的代码摘自User实体,位于注释上方)

   @ForeignKey(entity = Photo.class, parentColumns = "id", childColumns = "userPhotoId")
   @ColumnInfo(name = "userPhotoId")
   private Long userPhotoId;

   @ForeignKey(entity = Home.class, parentColumns = "id", childColumns = "userHomeId")
   @ColumnInfo(name = "userHomeId")
   private Long userHomeId;

除此之外,我应该添加带有@Ignore注释的实体,例如

   @Ignore
   private Photo userPhoto;

   @Ignore
   private House userHome;

然后我有一些用于数据管理的方法。

现在,我正在使用这种方式来设置数据。我认为,这是一个非常复杂的解决方案。

public void insertUser(@NonNull User user) {
    new AsyncTask<User, Void, Void>() {

        @Override
        protected Void doInBackground(User... users) {
            User newUser = users[0];

            Photo photo = newUser.getUserPhoto();
            House home = newUser.getUserHome();
            Long photoId = dao.insert(photo);
            Long houseId = dao.insert(home);

            newUser.setUserPhotoId(photoId);
            newUser.setUserHouseId(houseId);

            dao.insert(newUser);
            return null;
        }
    }.execute(user);
}

关于获取数据逻辑,我正在使用观察者。

LiveData<User> userLiveData = dao.getUserById(userId);
userLiveData.observeForever(new Observer<User>() {
   @Override
   public void onChanged(@Nullable User user) {
   //...
   //the last line will remove an observer before ending.                      
   userLiveData.removeObserver(this);
}

看起来很容易,但是如果您想从数据库中获取更多数据,它将变得更加复杂。这不是我想要的。我的想法就像

User user = getUserById(..);
user.getPhoto();
//...
//and working without worries

要么

insertUser(myUser);
//and I am sure that the sub-entities were added automatically without any special logic

我要寻找的是最好的(也是最简单的)解决方案,如果我的查询返回LiveData,则可以从具有实体的数据库实体发送/接收数据

或者,如果您有任何更好的经验,我将感谢您的任何有用答复。

感谢您的任何想法,我认为这可能对许多人有帮助。

本斯克

一个星期后,我找到了解决方案。所以我想分享。因此,我的建议是将Threads(或Android的AsyncTasks)与ViewModel一起使用,而不要使用LiveDatas。

检查下面的代码。

public class MyMV extends AndroidViewModel {
    private MutableLiveData<User> userLiveData = new MutableLiveData();

    //main logic for getting data from a db
    public void getUser(long userId) {
       new Thread(()-> {
          //do not use the '.setValue()', a post method will send a result to observers immediately
          userLiveData.postValue(new User(dao.getUserById(userId));
       }).start();
    }

    //UserLiveData getter
    public LiveData<User> getUserData() {
        return userLiveData;
    }
}

让我们转到活动或UI上的某个位置

//an observer is something like listener
myVM.getUserData().observe(this, user -> {
  //here we can work with user
});

如果您对视图模型有疑问,可以查阅文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用实体框架在数据库中添加 json 对象作为 BLOB

从房间数据库中删除实体

房间什么时候从数据库中删除实体?

使用实体框架从数据库中删除相关对象

如何在不应保留在数据库中的JPA实体bean中使用或注释伪字段

如何首先使用实体框架 6 代码将对象作为字符串存储在数据库中

使用不在数据库中的实体对象进行 LINQ 查询 - 错误:LINQ to Entities 无法识别该方法

如何在数据库优先和身份列中使用实体框架

Spring JPA:将实体对象保存在数据库中

JPA实体未保存在数据库中

将子实体添加到数据库,并将其分配给数据库Entity Framework Core中的父对象

如何使用Hibernate中的Example类在数据库中搜索相似实体

使用Hibernate更新实体,该实体的一个字段只能在数据库中编辑

避免使用实体框架将空值或空值保存在数据库中

实体未使用Entity Framework 6在数据库中更新

使用Dapper在数据库中执行动态实体

使用Framwork实体通过FileUpload上传文件并在数据库中存储

在实体框架中使用数据库优先实体和代码优先实体

在C#中使用实体框架在datagridview中显示数据库中的数据

安卓房间数据库:如何处理的ArrayList中的实体?

如何在Android的房间数据库中更改实体类文件

如何查询和过滤房间数据库中的关系实体

使用@Relation 从房间数据库中一次选择 3 个实体

数据未使用通用存储库和实体框架 5.0 保存在数据库中

如何在将父实体保存到数据库的同时保存子实体?

实体框架MVC和数据库中的“静态”对象

将具有反序列化的JSON对象保存到具有重复子实体的数据库中

使用 EntityDataReader 从数据库读取实体对象

实体框架 6 - 使用数据库中尚不存在的对象形成关系