2017-05-03 45 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 。

謝謝

相關問題