我试图获取某个用户所拥有的事件,但事实是,在执行orderByChild()
之后,它又过滤了一个我不想要的事件。
//I find the user that belongs to a certain Tutor
mDatabase.child("tutorjugadores").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshotJugador) {
for(final DataSnapshot snapshotJugadoresTutor : dataSnapshotJugador.getChildren()){
if(dataSnapshotJugador.exists()){
//If the user has not assisted to a certain event, I get the user that belongs to the user and get the event ID
mDatabase.child("asistenciasjugadores").orderByChild(snapshotJugadoresTutor.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshotEvento) {
for(DataSnapshot snapshotEventos : dataSnapshotEvento.getChildren()){
//Getting the event key from that user
String eventKey = snapshotEventos.getKey();
Log.d(TAG, "Event : "+eventKey + " of the user "+snapshotJugadoresTutor.getKey());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
现在,这是我的数据库结构
现在,当我运行此代码并执行日志以获取用户2UHHZWR6B8P9XJPuLYrAg6aEgN63
的事件时,我又收到了另一个不属于该用户的事件,该事件就是这个{{1 }}
事件:-用户的LU930PpCaQXT8CvUbc8 2UHHZWR6B8P9XJPuLYrAg6aEgN63
事件:-用户的LTRz61EcBUx-RLSSEaU 2UHHZWR6B8P9XJPuLYrAg6aEgN63
事件:-用户的LTSGFGdW1nQbtd9HOBh 2UHHZWR6B8P9XJPuLYrAg6aEgN63
事件:-用户的LTSIG_lqckgHEZ1q9YS 2UHHZWR6B8P9XJPuLYrAg6aEgN63
如您所见,正在列出该用户的所有事件,但该用户只有3个与之关联的事件。
当我订购这条线时
-LU930PpCaQXT8CvUbc8
我希望只获取具有用户ID .orderByChild(snapshotJugadoresTutor.getKey())
的节点,然后循环并从该用户获取每个事件ID,但是相反,我也从该用户获取事件ID {{1 }}。
答案 0 :(得分:1)
仅通过使用基于JSON的数据库(例如Firebase)无法过滤字符串。 而 orderByChild 仅更改返回值的排序。因此,您基本上是在对该键下的所有值进行排序,因此不会进行任何过滤。 在这之后,您有3个选择。
选项1-效率不高,仅建议用于小型应用程序: 您可以对所有值进行排序,然后再进行过滤。
选项2-推荐: 您可以更改数据结构。创建另一个节点,例如“ UserEvents”。在其下存储UID。在该UID下,应该只有该用户的事件。
选项3-推荐并起作用: 您可以使用Elasticsearch。非常适合复杂的查询。切换到“按需购买”计划后,可以将其与带有Google Cloud Functions的Firebase一起使用,也可以使用Flashlight扩展将另一台服务器与Firebase数据库集成。