Как использовать постоянство базы данных Firebase Realtime для хранения некоторых дочерних узлов - PullRequest
1 голос
/ 19 апреля 2020

Мой код работает нормально, без всяких cra * sh, но единственная проблема, с которой я столкнулся, не в состоянии синхронизировать c База данных реального времени Firebase в автономном режиме. Я пытался keepyn c (true) на некоторых узлах, но не работает. Я пытаюсь получить ссылку на узел Users из списка чата. То, что я пытаюсь сделать, - если пользователь вошел в систему, он увидит, что упомянутые пользователи находятся под Uid в узле списка чата внутри его recyclerview. Я могу сделать это успешно, но не могу сохранить этих пользователей в автономном режиме, когда соединение inte rnet уходит. Он снова загружает всех пользователей.

Мой код

    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);

    }
}

1 Ответ

2 голосов
/ 19 апреля 2020

Кажется, вы нигде не настраиваете постоянство. keepSynced только устанавливает слушателя. Вам нужно сделать что-то вроде:

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

Вызов setPersistenceEnabled возвращает логическое значение true, если постоянство было установлено.

Вам необходимо установить постоянство перед вызовом вашей первой ссылки.

Обновление:

Чтобы использовать Firebase в автономном режиме, вы включаете постоянство с помощью setPersistenceEnabled (true) при запуске приложения. После того, как вы сделали какие-либо вызовы из базы данных, вы не можете отключить его снова ie. использование setPersistenceEnabled (false) не имеет эффекта.

Ваши существующие слушатели будут гарантировать, что данные, на которые они ссылаются, будут синхронизированы c. Если у вас есть узлы базы данных, для которых не определены прослушиватели, и которые вы хотите синхронизировать c ie. храните данные fre sh, затем вы используете keepSynced для создания прослушивателя для них. Вы можете включить или выключить этот слушатель, используя keepSynced (true) и keepSynced (false). Если вы не сохраняете данные определенного узла c fre sh, то возможно, что приложение будет использовать более старые значения из постоянных данных на устройстве, поскольку оно обычно сначала их считывает. Однако будьте осторожны, когда вы используете keepSynced, иначе вы можете загружать слишком много данных.

См .: https://firebase.google.com/docs/database/android/offline-capabilities для получения всей информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...