Firebase - Firestore 数据查询两次调用两次

我有一个代码需要使用 Cloud Firestore 中的所有数据更新 UI,在一个集合下,然后需要在添加项目时更新 UI。我使用 Recycler 添加更多数据:


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_events);

    ButterKnife.bind(this);

    Toolbar toolbar = findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);


collection_events

            .get()

            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 

{

                @Override

                public void onComplete(@NonNull Task<QuerySnapshot> task) {

                    if (task.isSuccessful()) {

                        for (QueryDocumentSnapshot snapshot: 

Objects.requireNonNull(task.getResult())){

                            EventsCurrent eventsCurrent = 

snapshot.toObject(EventsCurrent.class);

                            eventsCurrent.setId(snapshot.getId());

                            Log.d(TAG,snapshot.getId());

                            eventsCurrentList.add(eventsCurrent);

                        }

                        LinearLayoutManager linearLayoutManager = new 

LinearLayoutManager(getApplicationContext());

                        eventsAdapter = new 

EventsAdapter(EventsActivity.this,eventsCurrentList);

                        eventsAdapter.setEventsCurrents(eventsCurrentList);


recylerview_events.setLayoutManager(linearLayoutManager);

                        recylerview_events.setHasFixedSize(true);

                        recylerview_events.setAdapter(eventsAdapter);

                        isFirstTime = false;

                    }else {

                        Log.d(TAG, "Error getting documents: ", 

task.getException());

                    }

                }

            });

}

在这里,我同时使用get()& ,addSnapshotListener()因此我最初通过 获取所有数据,get()并通过 获取更新或添加的数据 addSnapshotListener()。


监听器被调用并且我的数据加倍并且数据被填充两次的问题。


有人可以帮我吗?


紫衣仙女
浏览 70回答 2
2回答

米脂

监听器被调用并且我的数据加倍并且数据被填充两次的问题。发生这种情况是因为您同时使用get()&addSnapshotListener()来获取数据。实际上意味着您从数据库中获取数据一次又一次,您再次获取数据但实时,这就是您的数据翻倍的原因。如果要实时获取数据,只能使用addSnapshotListener().&nbsp;如果您只想获得一次,只需使用get()呼叫即可。两种方法具有相同的行为,但在 的情况下addSnapshotListener(),侦听器保持活动状态,直到您将其删除。

蝴蝶不菲

我有同样的问题,我通过在方法调用结束时使用'return@addSnapshotListener'来解决这个问题。&nbsp;mFirebaseFireStore.collection(AppConstant.FIREBASE_USER_TABLE).document(key).addSnapshotListener {result,error ->&nbsp; &nbsp; if(result==null){&nbsp; &nbsp; &nbsp; &nbsp;error?.message?.let { it1 -> Log.w("Error-Group", it1)&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return@addSnapshotListener&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; if(result.exists())&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //some code&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; return@addSnapshotListener&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java