2

중포 기지 데이터베이스 데이터를 가져 오는 안하지만 응용 프로그램을 실행 한 후이 목록보기에 데이터가 표시되지 않습니다내가 중포 기지 데이터베이스에 저장하는 사용자의 점수를 표시하는 응용 프로그램을 개발하고

아래

내 코드입니다 : -

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(); 

데이터베이스 스냅 샷 : -

enter image description here

출력 : -이 문제를 해결하려면

enter image description here

답변

2

이 시도 :

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) { 

     } 
    }); 
1

이 코드 행으로 이동 :이 방법의 비동기 행동 때문에, 그렇지 않은 경우는 항상있을 것입니다, onDataChange() 방법 내부

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

을하는 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); 
+0

leaderBoards.clear() 메소드가 오래된뿐만 아니라 새로운 데이터 표시 있도록 데이터를 덮어 쓰게됩니다 다음 삭제합니다. –

+0

루프가 고갈되면 데이터를 덮어 쓸 데이터가 없습니다. 그 이유가 바로 그 때문입니다. 시도 해봐. 작동합니까? –

+0

아니요 작동하지 않습니다 –

1

당신은 찾아 왼쪽의 데이터베이스 섹션을 클릭하여 프로젝트를 선택 중포 기지 console.Simply에서 데이터베이스에 대한 규칙을 변경 한 다음 규칙 탭을 선택할 수 있습니다 당신이이 일을했는지 ​​또는이 희망을 시도하지 않았는지 당신에게 도움이 될 것입니다.

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

인증되지 않은 사용자도 데이터베이스를 사용할 수 있도록 응용 프로그램 데이터 보안을 해치기 때문에 이러한 유형의 규칙을 사용하여 데이터베이스에 데이터를 저장하는 올바른 방법은 아닙니다. 도움을 주셔서 감사합니다 –

+0

귀하의 요구 사항에 따라 규칙을 변경할 수 있습니다 plz 링크를 참조하십시오 https://firebase.google.com/docs/reference/security/database/ – Payal

+0

맞습니다 Payal하지만 위의 규칙을 사용하면 누구든지 수정할 수 있습니다 허가없이 귀하의 데이터, 그리고 당신의 요지를 가지고 있지만 당신이 알고 :) –