从动态Firebase数据库中提取变量

时间:2018-11-06 00:27:14

标签: java android firebase firebase-realtime-database

所以我有一个游戏大厅,在这里用户创建游戏时,其用户名以及他们在游戏上下注的游戏币值将显示在屏幕上,供所有玩家在RecyclerView中查看。

因此,在这种情况下,名为“ Brent_MB”的用户创建了一个游戏

enter image description here

但是问题是玩家在游戏上下注2.00,因此不会出现。 (2.50是显示的默认数字)

这就是我的数据库结构

enter image description here

因此,由于该数据库是如此动态,因此每次有人要玩游戏时,它实际上都会更改,并且在游戏开始时会被删除,我该如何为当前表示“ 2.50”的插槽分配下注值

这是我尝试做的事情:

我已经为下注变量创建了这样的回调,

public void getWager(final WagerCallback wagerCallback) {
    FCGames.child("What do I put here to check each node every time a node is added")
            .child("wager").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                wagerr = (long) dataSnapshot.getValue();
                String wagerD = Double.toString(wagerr);
                wage = wagerD.endsWith("0");

                wagerCallback.onCallback(wagerD);
        }

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

我也有一个与此相关的回调接口,

然后在我的RecyclerView类中调用此方法,如下所示:

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    String userName = mData.get(position);
    holder.userName.setText(userName);
    holder.bind(mData.get(position), position, listener);

        fcl.getWager(new FlipCoinLobby.WagerCallback() {
            @Override
            public void onCallback(String wager) {
                holder.wager.setText(wager);
            }
        });

}

如您所见,在这一行中,我坚持将第一个孩子放置什么,以便它可以在添加每个孩子时检查每个孩子并获得该下注值。 \

FCGames.child("What do I put here to check each node every time a node is added").child("wager")

我应该放在那里,以便它可以从每个节点获取下注值并将其正确分配给文本视图区域?

FCGames数据库中的每个初始节点都存储在一个名为openGames的ArrayList中。我可以显示在必要时如何将节点添加到该列表中

wages.add(wagerD);

for(int i=0; i <= openGames.size(); i++) {
   wagerCallback.onCallback(wages.get(i));
}

1 个答案:

答案 0 :(得分:1)

由于您不知道要加载的子节点的密钥,因此有两种选择:

  1. 加载FCGames的所有子节点。
  2. 加载FCGames的第一个/最后一个子节点。

我将显示第二个选项,因为第一个选项很容易从中得出:

FCGames.orderByKey()
       .limitToFirst(1)
       .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            wagerr = snapshot.child("wager").getValue(Long.class);
            String wagerD = Double.toString(wagerr);
            wage = wagerD.endsWith("0");

            wagerCallback.onCallback(wagerD);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});

最大的区别是:

  • 我使用查询仅获取第一个密钥。
  • 然后我需要在onDataChange中使用循环,因为查询可以具有多个结果(尽管该结果不会)。