2017-08-03 58 views
0

簡介我創建了我的應用程序的數據庫,如下圖所示。Android:讀取子節點的密鑰

enter image description here

爲了顯示用戶保存的書籍,我想先讀取用戶的書籍鍵(位於user-books目錄),並保存所有這些密鑰的一個ArrayList,所以我可以在以後的負載(從books目錄)與名爲MybooksFragment的片段中的這些鍵相對應的BookObjects。

注:我想獲得和在ListView顯示這些按鍵,你可以看到下面(要確保我得到正確的鍵)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_my_books, container, false); 

    final ListView booksIdListView = (ListView) view.findViewById(R.id.booksIdListView); 

    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference databaseReference = database.getReference(); 

    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    String UID = user.getUid(); 

    databaseReference.child("books").child(UID).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      final List<String> booksId = new ArrayList<String>(); 

      for (DataSnapshot child: dataSnapshot.getChildren()) { 
       String userBookId = child.getKey(); 

       booksId.add(userBookId); 
      } 

      ArrayAdapter<String> myBooksAdapter = new ArrayAdapter<String>(getActivity() , 
    android.R.layout.simple_list_item_1 , booksId); 
      booksIdListView.setAdapter(myBooksAdapter); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

不幸ListView仍然是空的(沒有像我希望的那樣填充鍵)。 我在做什麼錯?

注:我使用這個數據庫模型,所以我可以躲開的重複數據

+0

嘗試使用Firebase的listadapter來填充節點 –

回答

1

你「首先嚐試讀取用戶的書籍鍵(位於用戶圖書目錄),並保存所有這些密鑰的一個ArrayList「,但你實際上不這樣做。

因此,爲了實現這一點,你需要改變這樣的你參考:

databaseReference.child("user-books").child(UID).addListenerForSingleValueEvent(new ValueEventListener() { 

因爲你要查詢的節點user-books,而不是簡單的books

爲了保持代碼相同的方式,因爲它是現在,你需要在你的數據庫中的變化不大,聽起來是這樣的:

Firebase-root 
    | 
    --- user-books 
      | 
      --- userId1 
      |  | 
      |  --- bookId1: true 
      |  | 
      |  --- bookId2: true 
      |  | 
      |  --- bookId2: true 
      | 
      --- userId2 
       | 
       --- bookId4: true 
       | 
       --- bookId5: true 
       | 
       --- bookId6: true 

你只需要與價值兒童的獨特的書籍ID真實的。

希望它有幫助。

+0

這是一個愚蠢的錯誤來引用孩子「書籍」。我複製粘貼eventListener從其他片段獲取對象從「書籍」的孩子,並忘記修改它在這裏的「用戶書籍」。現在它可以工作。我不敢相信我是多麼的愚蠢。您能否重新說一句,爲什麼我需要爲book ID添加true的值? –

+0

爲了簡化您的數據庫。你不需要使用'bookId'兩次,一次作爲一個鍵,一次作爲'bookId'的值,你可以只使用一次。因爲您擁有'book id'和'true'的值,所以您將能夠以相同的方式獲得這些孩子。 –

+0

謝謝Alex。 –