我一直在研究这样的时间,以找出解决该问题的最佳方法。假设我想将一个实体放入另一个实体
@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] 删除。
我来说两句