Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase将侦听器附加到查询对象_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase将侦听器附加到查询对象

Android Firebase将侦听器附加到查询对象,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,根据我们的观点,将侦听器附加到数据库层次结构中的高层是一种不好的做法。我有一个称为“地点”(非常大)的高级字段,我正在获取它的引用。但是当我要附加我正在使用的侦听器(ChildEventListener)时 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference placesReference = database.getReference("places"); placesReference.o

根据我们的观点,将侦听器附加到数据库层次结构中的高层是一种不好的做法。我有一个称为“地点”(非常大)的高级字段,我正在获取它的引用。但是当我要附加我正在使用的侦听器(ChildEventListener)时

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference placesReference = database.getReference("places");
placesReference.orderByChild("city").equalsTo("Madrid").addChildEventListener(....)
只检索那个城市的地方

我的问题是——如果听者只依附于

city = "Madrid"
或附加到整个位置级别层次结构,因此是一种不好的做法

编辑

这是我的数据库

[...]
"places" : {
  "SomePlaceID_1" : {
      "address" : "Some address",
      "city" : "Madrid",
      "coord_latitude" : 12.122121,
      "coord_longitude" : 12.122121
  },
  "SomePlaceID_2" : {
      "address" : "Some address",
      "city" : "Madrid",
      "coord_latitude" : 12.122121,
      "coord_longitude" : 12.122121
  },
  "SomePlaceID_3" : {
      "address" : "Some address",
      "city" : "Barcelona",
      "coord_latitude" : 12.122121,
      "coord_longitude" : 12.122121
  },
  [...]
},
[...]

因此,如果您使用的是
placesReference.orderBy(“city”)。equalsTo(“Madrid”)
表示您的引用设置在
placesReference
上,则它会附加到所有位置或仅包含城市的位置。如果数据库中只有一个名为马德里的城市,则无需使用
orderBy()
方法,只需使用以下代码行:

placesReference.child("city").child("Madrid").addChildEventListener(....)
这是绝对正确的,因为您现在在层次结构树中向下走了2步。因此,在本例中,您仅从Madrid节点获取数据

编辑:

在编辑之后查看数据库,我可以说您添加侦听器的方式非常正确。这是使用当前数据库结构实现这一点的方法。请记住,侦听器被附加在您放置它的确切引用上。在这种情况下,附加到所有位置(SomePlaceID_1、SomePlaceID_2等),而不仅仅是那些有一个具有“马德里”值的孩子的特定位置。使用
.orderByChild(“城市”).equalsTo(“马德里”)
只是一个命令。对值使用此顺序equalsTo(“Madrid”)并不意味着侦听器设置在那里。在上面解释的示例中,侦听器在三个步骤中向下放置两个步骤

在您的案例中,解决方案是扁平化数据库。这意味着您需要添加另一个节点,在该节点中您只能添加来自马德里的位置。而不是仅在该特定节点上添加侦听器

我建议你和我一起阅读这篇文章,以便更好地理解


希望它能有所帮助。

答案是它只附在你放听众的地方。假设下面是我的数据库

{
  "places": {
    "a": {
      "city": "Madrid"
    },
    "b": {
      "city": "Madrid"
    },
    "c": {
      "city": "SomeCity"
    }
  }
}
让我们看看你是否像这样附加了侦听器

placesReference.child("places").orderByChild("city").equalsTo("Madrid")
         .addChildEventListener(....)
然后dataSnapshot将返回如下所示

{
    "a": {
      "city": "Madrid"
    },
    "b": {
      "city": "Madrid"
    }
}
所以你的问题的答案是否定的。如果以这种方式使用,侦听器将不会附加到整个层次结构级别

更新:

你的问题:那么,它是附在所有地方还是只附在有城市的地方:“马德里”

我的答案:它只附加到
SomePlaceID\u 1
一个
SomePlaceID\u 2
上,因为它们是唯一一个具有
子(“城市”)
值等于
马德里“
的子节点


假设您将
SomePlaceID\u 3
地址更改为
“另一个地址”
。侦听器不会受到影响。

例如,根引用是“countriers”

你想计算一个城市的类型,它是马德里还是你想要的

databaseReference = FirebaseDatabase.getInstance().getReference().child("Countries");
    databaseReference.limitToFirst(5);

    Query query = databaseReference.orderByChild("city").equalTo("Madrid");

    ChildEventListener removedListener = query.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            if (dataSnapshot.exists()){

              long  count=  dataSnapshot.getChildrenCount();


            }


        }

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

            if (dataSnapshot.exists()){

                long  count=  dataSnapshot.getChildrenCount();


            }


        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()){

                long  count=  dataSnapshot.getChildrenCount();


            }



        }

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


        }

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

        }
    });

如果您只有一个城市,并且没有其他任何东西要订购,为什么要使用
.orderBy(“城市”).equalsTo(“马德里”)
呢?您使用的是orderByChild,不是吗?请参阅我的编辑:如果我更改了某地ID\u 3(不在马德里),侦听器将启动但不执行,因为城市不等于马德里或根本不启动的侦听器未连接到SomePlaceID_3?@jorge如果更改SomePlaceID_3,侦听器将根本不会启动,因为它首先未连接到SomePlaceID_3。希望有帮助。抱歉,但我认为另一个答案是正确的,因为orderBy().equalsTo()这只是一个顺序,因为这些方法检索查询对象,并且侦听器附加到检索到的查询中的DatabaseReference对象。
databaseReference = FirebaseDatabase.getInstance().getReference().child("Countries");
    databaseReference.limitToFirst(5);

    Query query = databaseReference.orderByChild("city").equalTo("Madrid");

    ChildEventListener removedListener = query.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            if (dataSnapshot.exists()){

              long  count=  dataSnapshot.getChildrenCount();


            }


        }

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

            if (dataSnapshot.exists()){

                long  count=  dataSnapshot.getChildrenCount();


            }


        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()){

                long  count=  dataSnapshot.getChildrenCount();


            }



        }

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


        }

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

        }
    });