java - 从动态 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));
}
解决方案
由于您不知道要加载的子节点的密钥,因此您有两种选择:
- 加载 的所有子节点
FCGames
。 - 加载 的第一个/最后一个子节点
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
,因为查询可以有多个结果(事件虽然这个不会)。
推荐阅读
- google-apps-script - 使用 API 将 Google 幻灯片(和绘图)链接到 Google Doc
- flutter - Flutter:列表滚动上的 sliverAppBar 调整大小问题
- node.js - 带有 NodeJs sdk 版本 4.0 的 Microsoft Bot Framework 不允许多个用户会话
- u-boot - 如何在 Coral 开发板启动期间禁用控制台消息?
- django - 如何在Django2.1的模板内的for循环内设置变量?
- scala - 在 scala 项目中创建 power point 并得到导入错误。导入 org.apache.poi.ss.usermodel。尝试导入 ss 作品
- php - PHP表单上的多个签名
- python - 是否有一个 cookiecutter fork 可以为 CircleCI(而不是 TravisCI)生成项目模板?
- c++ - 使用 C++ 文件编译 C 共享对象
- javascript - 在对象数组中搜索从另一个数组提供的特定键