2017-05-03 34 views
1
public class Post { 

    private String title; 
    private String massage; 

    public Post() { 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getMassage() { 
     return massage; 
    } 

    public void setMassage(String massage) { 
     this.massage = massage; 
    } 
} 

public class Posts extends AppCompatActivity { 

    private DatabaseReference databaseReference, barRoomsCoordinates; 
    private FirebaseDatabase firebaseDatabase; 
    private List<Post> postList; 
    private List<String> list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_posts); 

     postList = new ArrayList<>(); 
     list = new ArrayList<>(); 

     showAllMyPosts(); 


    } 

    private void getPosts(List<String> posts) { 

     for (int i = 0; i < posts.size(); i++) { 
      databaseReference = firebaseDatabase.getReference().child("Posts").child(posts.get(i)); 
      databaseReference.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Post posts = dataSnapshot.getValue(Post.class); 
        Post post = new Post(); 

        post.setTitle(posts.getTitle()); 
        post.setMassage(posts.getMassage()); 
        postList.add(post); 



       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 
    } 

    private void showAllMyPosts() { 
     FirebaseApp.initializeApp(Posts.this); 

     Handler handler = new Handler(); 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       barRoomsCoordinates = firebaseDatabase.getReference().child("Posts"); 
       barRoomsCoordinates.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         Iterator iterator = dataSnapshot.getChildren().iterator(); 
         while (iterator.hasNext()) { 
          list.add(((DataSnapshot) iterator.next()).getKey()); 
         } 
         getPosts(list); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     }; 
     handler.post(runnable); 
    } 
} 

这是我的数据库结构为什么我从Firebase数据库中获取重复的数据?

Posts 
Post1 
message1: 
"abc + something" 
title1: 
"abc" 
Post2 
message2: 
"def + something" 
title2: 
"def" 
Post3 
message3: 
"ghi + something" 
title3: 
"ghi" 

我越来越重复的阵列和无法理解为什么 请帮助我。 我也尝试删除一个引用,并进行调用,但以这种方式,我无法访问JSON的孩子。

回答

1

这是因为你的for loop。每次循环时都会创建一个新的databaseReference。从循环中取出databaseReference,它将解决您的问题,或尝试更改从Firebase数据库获取数据的逻辑。

希望它有帮助。

+0

亚历克斯感谢您的及时回复。 –

+0

欢迎你Shai Shamai。 –

+0

在第一次引用中,我正在获取Post1,Post2,Post3列表,然后我试图获取每个帖子的子标题和消息。 { “POST1”:{ “MESSAGE1”: “ABC +的东西”, “TITLE1”: “ABC” }, “POST2”:{ “消息2”: “高清+的东西”, “标题2” : “DEF” }, “Post3”:{ “消息3”: “GHI +的东西”, “TITLE3”: “GHI” } } –

0

公共类职位扩展AppCompatActivity {

private DatabaseReference databaseReference, barRoomsCoordinates; 
private FirebaseDatabase firebaseDatabase; 
private List<Post> postList; 
private List<String> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_posts); 

    postList = new ArrayList<>(); 
    list = new ArrayList<>(); 

    getPosts(); 


} 

private void getPosts() { 

    databaseReference = firebaseDatabase.getReference().child("Posts"); 
    databaseReference.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      Iterator iterator = dataSnapshot.getChildren().iterator(); 
      while (iterator.hasNext()) { 
       Post post = new Post(); 
       post.setTitle((String) ((DataSnapshot)iterator.next()).getValue()); 
       post.setMassage((String) ((DataSnapshot)iterator.next()).getValue()); 

       postList.add(post); 

      } 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

}

您好所有,

我解决我的问题与一个参考数据库,而不是两个电话,因为我以前那样,用addChildEventListener 。

谢谢

相关问题