加入Firebase模型并使用合并结果更新实时数据

时间:2018-07-23 17:33:45

标签: android firebase mvvm viewmodel android-livedata

HelloBelow是我的数据库结构 enter image description here

我想首先从发布对象中获取结果,并从中获取用户对象中的结果使用“ userid”。 我想用包含两个对象中的字段的上述结果更新ViewModel 如何实现呢? 我已经编写了代码来从post对象获取结果,但是如何再次调用以获取用户对象并更新viewmodel和livedata对象

MetaValue

1 个答案:

答案 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。希望有帮助