首页 > 解决方案 > 从动态 Firebase 数据库中提取变量

问题描述

所以我有一个游戏大厅,当用户创建游戏时,他们的用户名和他们在游戏上下注的游戏货币出现在屏幕上,供所有玩家在 RecyclerView 中查看。

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

在此处输入图像描述

但问题是玩家在游戏中下注 2.00 并且不会出现。(2.50 是出现的默认数字)

这就是我的数据库结构的样子

在此处输入图像描述

因此,由于这个数据库是如此动态,每次有人想玩游戏时它都会发生变化,并且在游戏开始时它会被删除,我该如何将投注值分配给当前显示“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));
}

标签: javaandroidfirebasefirebase-realtime-database

解决方案


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

  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,因为查询可以有多个结果(事件虽然这个不会)。

推荐阅读