【问题标题】:Not getting Firebase database data未获取 Firebase 数据库数据
【发布时间】:2017-11-15 10:23:49
【问题描述】:

我正在开发应用程序来显示存储在 firebase 数据库中的用户分数,但运行应用程序后它不会在列表视图中显示数据

下面是我的代码:-

listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board);

        reference = FirebaseDatabase.getInstance().getReference("score");

        leaderBoards = new ArrayList<>();

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                    LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class);
                    leaderBoards.add(0,leaderBoard);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        //Collections.sort(leaderBoards);
        CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards);
        listViewLeaderBoard.setAdapter(adapter);
        adapter.notifyDataSetChanged();

数据库快照:-

输出:-

【问题讨论】:

    标签: java android firebase listview firebase-realtime-database


    【解决方案1】:

    试试这个:

    listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board);
    
        reference = FirebaseDatabase.getInstance().getReference("score");
    
        leaderBoards = new ArrayList<>();
    
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                    LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class);
                    leaderBoards.add(leaderBoard);
             CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards);
        listViewLeaderBoard.setAdapter(adapter);
        adapter.notifyDataSetChanged();
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    

    【讨论】:

      【解决方案2】:

      要解决这个问题,移动这行代码:

      List<LeaderBoard> leaderBoards = new ArrayList<>();
      

      onDataChange() 方法内,否则它将一直存在,因为此方法的异步行为甚至在您尝试将LeaderBoard 类的那些对象添加到列表之前就被调用。

      另外,leaderBoards.clear(); 也不再需要了。您的代码应如下所示:

      DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
      DatabaseReference scoreRef = rootRef.child("score");
      ValueEventListener eventListener = new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              List<String> list = new ArrayList<>();
              for(DataSnapshot ds : dataSnapshot.getChildren()) {
                  String imageUrl = ds.child("imageUrl").getValue(String.class);
                  String name = ds.child("name").getValue(String.class);
                  long score = ds.child("score").getValue(Long.class);
                  Log.d("TAG", image + " / " + Urlname + " / " + score);
                  list.add(image + " / " + Urlname + " / " + score);
              }
              Log.d("TAG", list);
          }
      
          @Override
          public void onCancelled(DatabaseError databaseError) {}
      };
      scoreRef.addListenerForSingleValueEvent(eventListener);
      

      【讨论】:

      • 如果 leaderBoards.clear() 方法删除,那么它将覆盖数据,因此它显示旧数据和新数据。
      • 在循环开始时不会有数据被覆盖,这就是为什么 a 这么说的原因。试一试。有用吗?
      • 错误是什么?添加更新代码的屏幕截图。
      • 没有报错但是listview还是空白,请看我更新的代码。
      • 好吧,它不工作,但为什么呢?错误是什么?行为是什么?我正在努力提供帮助。
      【解决方案3】:

      您可以在 Firebase 控制台中查找和更改数据库的规则。只需选择您的项目,单击左侧的“数据库”部分,然后选择“规则”选项卡。我不知道您是否这样做了试试这个,希望对你有帮助。

      {
      "rules": {
      ".read": true,
      ".write": true
      }
      }
      

      【讨论】:

      • 这不是用这种规则在数据库中存储数据的正确方法,因为它破坏了应用程序数据的安全性,因此任何未经身份验证的用户也可以使用您的数据库。感谢您的帮助
      • 你可以根据你的要求更改规则请参考链接firebase.google.com/docs/reference/security/database
      • 没错,Payal 但如果您使用上述规则,那么任何人都可以在未经许可的情况下修改您的数据,我明白您的意思,但您知道 :)
      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多