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