我想首先从发布对象中获取结果,并从中获取用户对象中的结果使用“ userid”。 我想用包含两个对象中的字段的上述结果更新ViewModel 如何实现呢? 我已经编写了代码来从post对象获取结果,但是如何再次调用以获取用户对象并更新viewmodel和livedata对象
MetaValue
答案 0 :(得分:0)
有多种方法可以对数据库进行建模以将其归档。遵循最佳实践总是好的,请参见:https://firebase.google.com/docs/database/android/structure-data#best_practices_for_data_structure
在这种情况下,由于您只需要个人资料图片和名称,因此我将其直接保存到对象中:
{
"Posts":{
"post1":
{
"likes":23,
"userId":"id",
"user":
{
"imageUrl":"url",
"name":"Name"
}
}
}
}
当然,要权衡的是,如果用户节点被更新,则图像URL不会被更新(例如,除非您编写一些代码以在Cloud Function中对其进行更新)
另一方面,您还可以对Firebase Realtime数据库执行这两个调用(一个获取帖子,另一个获取用户数据):
ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get Post object and use the values to update the UI
Post post = dataSnapshot.getValue(Post.class);
ValueEventListener userListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot userDataSnapshot) {
post.setUser(userDataSnapshot.getValue(User.class);)
}
};
mUserReference.addListenerForSingleValueEvent(userListener);//only fetch data once
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
};
mPostReference.addValueEventListener(postListener);
编辑:
另一方面,由于在使用FirebaseQueryLiveData https://firebase.googleblog.com/2017/12/using-android-architecture-components.html,并且可能希望避免使用架构组件(因此请确保具有适当的类以进行反序列化),将用户对象包含在帖子中在该发布节点上编写用户,我认为您可以同时拥有两个具有不同数据库引用的ViewModel,并且一旦获取数据,您就可以更新发布对象,例如与post.setUser(user)
的用户从另一个ViewModel Observer获取,然后更新UI。您也可以使用HashMap来跟踪哪些帖子需要什么用户,尽管此答案看起来很可行:https://stackoverflow.com/a/46483213/1537389。希望有帮助