繁体   English   中英

如何使用 Firebase 实时数据库持久性来存储节点的一些子节点

[英]How to use Firebase Realtime Database persistence to store some childs of a node

我的代码工作正常,没有任何崩溃,但我遇到的唯一问题是无法同步 Firebase 实时数据库离线我在某些节点上尝试过 keepsync(true) 但不起作用。我正在尝试从聊天列表中获取节点用户的引用. 我想要做的是,如果用户登录,他将看到下面提到的用户是他的 recyclerview 中 Chatlist 节点中的 Uid。我能够成功地做到这一点,但当互联网连接断开时,我无法离线存储这些用户。 它再次加载所有用户。

我的代码

    public class Chats extends Fragment {

    private RecyclerView recyclerView;
    private UserAdapter mUserAdapter;
    FloatingActionButton profile, credentials;

    DatabaseReference rootRef;
    DatabaseReference ChatlistRef;
    DatabaseReference UserRef0;
    DatabaseReference UserRef1;
    DatabaseReference UserRef2;


    ValueEventListener mValueEventListener;
    ValueEventListener eventListener0;
    ValueEventListener eventListener1;
    ValueEventListener eventListener2;



    List<String>  UserChatList= new ArrayList<>();
    private List<User> mUsers;

    String TAG ="Tag2";
    private static final String MESSAGE_KEY = "Message_Key";

    private Handler mHandler;

    int UserListSize;

    public Chats() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_chats, container, false);

        //DatabaseReference ChatListReference = FirebaseDatabase.getInstance().getReference
                //("Chatlist").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        //ChatListReference.keepSynced(true);

        profile = view.findViewById(R.id.fab_edit_profile_pic);
        credentials = view.findViewById(R.id.fab_edit_name);
        FabAction();

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mUsers = new ArrayList<>();

        // mUserAdapter.notifyDataSetChanged();

        //callChatlist();
        chatlist_loop();

        return view;
    }

    private void chatlist_loop(){
        mUsers.clear();

        mUserAdapter = new UserAdapter(getContext(), mUsers, false);
        recyclerView.setAdapter(mUserAdapter);
        mUserAdapter.notifyDataSetChanged();


        String fuser;
        fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();
        rootRef = FirebaseDatabase.getInstance().getReference();
        ChatlistRef = rootRef.child("Chatlist").child(fuser);
        ChatlistRef.keepSynced(true);


        mValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    String userID = ds.getKey();

                    DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(userID);
                    UserRef.keepSynced(true);
                    Log.d(TAG," UserRef : "+UserRef);


                    ValueEventListener eventListener=new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            User user = dataSnapshot.getValue(User.class);

                            if(!mUsers.contains(user)){
                                mUsers.add(user);
                                mUserAdapter.notifyDataSetChanged();

                            }

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    };


                    UserRef.addListenerForSingleValueEvent(eventListener);

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
            }
        };
        ChatlistRef.addValueEventListener(mValueEventListener);

    }
}

您似乎没有在任何地方设置持久性。 keepSynced 只设置一个监听器。 您需要执行以下操作:

FirebaseDatabase database;
database = FirebaseDatabase.instance;
bool success = database.setPersistenceEnabled(true);

如果设置了持久性,则对 setPersistenceEnabled 的调用返回一个布尔值 true。

您需要在调用第一个引用之前设置持久性。

更新:

要离线使用 Firebase,请在启动应用程序时使用 setPersistenceEnabled(true) 打开持久性。 完成任何数据库调用后,您无法再次将其关闭,即。 使用 setPersistenceEnabled(false) 没有效果。

您现有的侦听器将确保他们引用的数据保持同步。 如果您的数据库节点没有定义侦听器并且您希望保持同步,即。 保持数据新鲜,然后使用 keepSynced 为它们创建一个监听器。 您可以使用 keepSynced(true) 和 keepSynced(false) 打开或关闭该侦听器。 如果您不主动保持特定节点数据的最新状态,则应用程序可能会使用设备上持久数据中的旧值,因为它通常会首先读取该值。 但是,在使用 keepSynced 时要小心,否则您可能会发现自己下载了太多数据。

有关所有信息,请参阅: https://firebase.google.com/docs/database/android/offline-capabilities

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM