为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

紫衣仙女 2022-06-04 09:19:45
我有一个代码需要使用 Cloud Firestore 中的所有数据更新 UI,在一个集合下,然后需要在添加项目时更新 UI。我使用 Recycler 添加更多数据:@Overrideprotected 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()。监听器被调用并且我的数据加倍并且数据被填充两次的问题。有人可以帮我吗?
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2022-06-04
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我有同样的问题,我通过在方法调用结束时使用'return@addSnapshotListener'来解决这个问题。


 mFirebaseFireStore.collection(AppConstant.FIREBASE_USER_TABLE).document(key).addSnapshotListener {result,error ->

    if(result==null){

       error?.message?.let { it1 -> Log.w("Error-Group", it1)

    }

           return@addSnapshotListener

        }


    if(result.exists())

      {

        //some code

      }

    return@addSnapshotListener

 }


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信