【问题标题】:Android: How to add values in Firebase database without triggering Listeners?Android:如何在不触发监听器的情况下在 Firebase 数据库中添加值?
【发布时间】:2018-08-30 14:57:33
【问题描述】:

我使用setValue() 来更新我的 Firebase 数据库中的值,只要它的状态发生变化。但是不断更新该值会触发不需要的eventListeners

有没有什么方法可以在不触发其他不打算触发的事件监听器的情况下更新 Firebase 数据库上的值?

这是设置值的代码:

stamp = isOnline();

        final DatabaseReference rRef = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference uref = rRef.child("users");
        final DatabaseReference sRef = uref.child(mAuth.getUid());

        sRef.child("online_status").setValue(stamp);

被触发的监听器(我不想):

uRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                ms = dataSnapshot.child("rec_msg").getValue(String.class);
                fUid = dataSnapshot.child("fromUID").getValue(String.class);
                st = dataSnapshot.child("rec_secret").getValue(String.class);
                boolean tell = dataSnapshot.child("online_status").getValue(Boolean.class);
                if(tell)
                    setTitle(hName + " (online)");
                int km = 0;
                try {
                    km = Integer.parseInt(st);
                }
                catch (NumberFormatException e) {
                    Log.d("NumberError:", "Can't convert");
                }

                if(ms!=null && !ms.equals(""))
                    addMessageBox(ms,km);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                ms = dataSnapshot.child("rec_msg").getValue(String.class);
                fUid = dataSnapshot.child("fromUID").getValue(String.class);
                st = dataSnapshot.child("rec_secret").getValue(String.class);

                boolean tell = dataSnapshot.child("online_status").getValue(Boolean.class);
                if(tell)
                    setTitle(hName + " (online)");

                int km = 0;
                try {
                    km = Integer.parseInt(st);
                }
                catch (NumberFormatException e) {
                    Log.d("NumberError:", "Can't convert");
                }


                if(ms!=null && !ms.equals(""))
                    addMessageBox(ms,km);

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                Toast.makeText(Main5Activity.this,"User left the conversation", Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

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

            }
        });

【问题讨论】:

  • 请提供一个最小的工作示例并向我们展示您到目前为止所做的尝试。

标签: java android firebase firebase-realtime-database event-listener


【解决方案1】:

为了在 Firebase 实时数据库中设置/更新属性值,无需使用监听器。侦听器用于读取数据,而用于写入或更新数据。您可以直接在引用上使用setValue()updateChildren() 方法,如下所示:

yourRef.setValue(yourObject);

更多详情here.

将此位置的数据设置为给定值。

yourRed.updateChildren(yourMap);

更多详情here

将特定的子键更新为指定的值。

编辑:

如何在 Firebase 数据库中添加值而不触发侦听器?

只要您在不断变化的属性上添加了侦听器,您就会始终收到有关更改的通知,因为这就是侦听器的工作方式。如果您想在不触发侦听器的情况下添加值,则不应将它们附加到该特定引用。您不能添加一个不断寻找变化并期望它不会被触发的侦听器。

【讨论】:

  • 我不是有意传达你所得到的,对不起。我已经编辑了问题并添加了帮助代码。
  • 我明白了。在这种情况下,请参阅我更新的答案中的 *edit
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2018-02-12
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多