Firebase实时数据库访问不完整?

时间:2017-08-06 08:50:52

标签: android for-loop firebase firebase-realtime-database

我有一个应用程序,存储256行数字,表示网格视图中每256个单元格的背景颜色。目前所有值均为-16449536,表示黑色为简单起见。

以下是我在Firebase数据库中的JSON结构

 "publicwall" : {
    "cell0" : -16449536,
    "cell1" : -16449536,

...........

    "cell254" : -16449536,
    "cell255" : -16449536

  },

在onCreate方法中,我使用for循环为每个单元格读取256次:

    for (int i = 0; i < 256; i++) {
        final int position = i;
        DatabaseReference cell_color = mDatabase.child("publicwall").child("cell" + i);
        cell_color.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                ColorData = dataSnapshot.getValue(int.class);
                gridAdapter.notifyColorChange(ColorData, position);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

结果是这张照片: I expect all dots to be black

并非所有网格都是黑色的。 每次我重新打开应用程序以触发onCreate方法时,网格模式都会有所不同。我对firebase实时数据库有一些限制吗?

1 个答案:

答案 0 :(得分:0)

无论当前代码中存在哪些问题,您最好用一个ChildEventListener替换256(!!!)听众:

mDatabase.child("publicwall").addChildEventListener(new ValueEventListener() {
  public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
      String key = dataSnapshot.getKey();
      int position = Integer.parseInt(key.substring(4));
      ColorData = dataSnapshot.getValue(int.class);
      gridAdapter.notifyColorChange(ColorData, position);
  }
  public void onChildChanged(DataSnapshot dataSnapshot) {
      String key = dataSnapshot.getKey();
      int position = Integer.parseInt(key.substring(4));
      ColorData = dataSnapshot.getValue(int.class);
      gridAdapter.notifyColorChange(ColorData, position);
  }
  ...
}

您需要实施更多方法,但这些方法是最重要的方法。

我建议阅读listening for lists of data in the Firebase documentation