代码之家  ›  专栏  ›  技术社区  ›  Gastón Saillén Michael Lehenbauer

OrderByChild向结果中再添加一个元素

  •  0
  • Gastón Saillén Michael Lehenbauer  · 技术社区  · 7 年前

    我试图获取某个用户所拥有的事件,事情是这样做之后 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) {
    
                }
            });
    

    现在,这是我的数据库结构

    enter image description here

    问题

    现在,当我运行此代码并执行日志以获取用户的事件时 2UHHZWR6B8P9XJPuLYrAg6aEgN63 ,我又得到一个不属于该用户的事件,该事件就是这个事件 -LU930PpCaQXT8CvUbc8

    :-LU930PpCaQXT8CvUbc8 用户的 2UHZWR6B8P9XJPULYRAG6EGN63

    事件 :-LTRz61EcBUx RLSSEaU 用户的 2UHZWR6B8P9XJPULYRAG6EGN63

    事件 用户的 2UHZWR6B8P9XJPULYRAG6EGN63

    :-LTSIG_LQCKGHZ1Q9YS

    如您所见,正在列出该用户的所有事件,但该用户只有3个与之关联的事件。

    .orderByChild(snapshotJugadoresTutor.getKey())
    

    我希望只获得具有用户ID的节点 2UHZWR6B8P9XJPULYRAG6EGN63 然后循环并从该用户处获取每个事件ID,但我也从该用户处获取事件ID GVD0bLDf41VDdraN67mXjAS6KPk1 .

    1 回复  |  直到 6 年前
        1
  •  1
  •   DeveloperKurt    7 年前

    仅使用基于JSON的数据库(如Firebase)无法使用字符串进行过滤。 orderByChild 仅更改返回值的排序。因此,您基本上是对该键下的所有值进行排序,没有进行过滤。 在这一点上,你有3个选择继续。

    选项1-效率不高,建议仅用于小型应用程序: 您可以对所有值进行排序,然后进行筛选。

    备选案文2——建议: 您可以更改数据结构。创建另一个节点,如“UserEvents”。在它下面存储UID。在这个UID下应该只有那个用户的事件。

    您可以使用Elasticsearch。它非常适合复杂的查询。在切换到“按量付费”计划后,您可以将其与Firebase和Google云功能结合使用,也可以使用手电筒扩展将另一台服务器与Firebase数据库集成。