2015-06-01 17 views
36

Android Firebase'de bir çocuk nesnesinin verilerini almanın bir yolunu arıyorum.Android Firebase, sadece bir alt nesnenin verilerini al

Firebase retrieve child Android gibi öğeler buldum. Tüm çözümler bir "ChildEventListener" kullanılmasını önermektedir, ancak şu anda bu veriyi almamalı, taşındığında, silinirken, güncellendiğinde vb.

Verilerim bir dizgi olarak https: //.firebaseio.com/users//creation adresinde tutulur. Bunu yapmak için çok fazla bir şey yapmanıza gerek kalmadan ulaşmanın basit bir yolu olmalı, çünkü tam URL’yi tarayıcımla kopyalıyorsam, şunu görebiliyorum: 'Yaratılış:' 2015/05/31 21:33:55 "' "Firebase Forge Dashboard" bölümünde.

Takdir edilebilecek bir değişiklik için dinleyici olmadan bu bilgiye nasıl erişileceğini bilen biri varsa!

Teşekkür ederiz!

cevap

44

Firebase dinleyicileri, hem ilk veriler hem de değişiklikler için ateşler.

Verileri bir koleksiyonda senkronize etmek istiyorsanız, ChildEventListener'u kullanın. Tek bir nesneyi senkronize etmek istiyorsanız, ValueEventListener'u kullanın. Her iki durumda da verileri "almamanız" gerektiğini unutmayın. Senkronizasyon yapıyorsunuz, bu da geri çağrının birden çok kez çağrılabileceği anlamına gelir: ilk veriler için ve veriler her ne zaman güncellendiyse.

Bu, Firebase's quickstart guide for Android kapsamındadır. İlgili kod ve alıntı: Yukarıdaki örnekte

FirebaseRef.child("message").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    System.out.println(snapshot.getValue()); //prints "Do you have data? You'll love Firebase." 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) {   
    } 
}); 

, değer etkinliği bu veri değişikliklerinin değeri yine o her zaman verilerinin başlangıç ​​durumuna kez ateş ve edecektir.

Lütfen bu hızlı başlangıçtan geçmek için birkaç dakikanızı ayırın. 15 dakikadan fazla sürmemeli ve sizi kafa çiziklerinden ve sorulardan kurtarır. Firebase Android Guide, muhtemelen bu soru için özellikle iyi bir sonraki hedeftir: https://firebase.google.com/docs/database/android/read-and-write

+1

Harika bir yardımdın! – 26hmkk

+0

Teşekkürler, mükemmel çalışıyor. –

17

Doğrudan bir değer okumadınız. .setValue() ile ayarlayabilirsiniz, ancak başvuru nesnesinde .getValue() yoktur.

Bir dinleyici kullanmanız gerekir. Sadece değeri bir kez okumak isterseniz, ref.addListenerForSingleValueEvent() kullanın.

Örnek:

Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String value = (String) dataSnapshot.getValue(); 

     // do your stuff here with value 

    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 

Kaynak: https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once

+2

Bu, özellikle ".getValue()" gibi, bir defada firebase veritabanınızda bir miktar veri almak için basit bir kod satırı bulunmadığı sorusunu yanıtlayan yanıttır. Daha sonra, bunu nasıl yapacağınızı söyler, '.addListenerForSingleValueEvent', bir referansla. 'FirebaseError' notu, daha genel 'DatabaseError' değerine amortismana alındı. – Androidcoder

8

benim veri bu şekilde saklayın:

accountsTable -> 
    key1 -> account1 
    key2 -> account2 

nesne verileri almak amacıyla:

accountsDb = mDatabase.child("accountsTable"); 

accountsDb.child("some key").addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 

        try{ 

         Account account = snapshot.getChildren().iterator().next() 
            .getValue(Account.class); 


        } catch (Throwable e) { 
         MyLogger.error(this, "onCreate eror", e); 
        } 
       } 
       @Override public void onCancelled(DatabaseError error) { } 
      }); 
9

sadece getir belirli düğüm veriler ve benim için çalışma mükemmel

mFirebaseInstance.getReference("yourNodeName").getRef().addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 


     for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
      Log.e(TAG, "======="+postSnapshot.child("email").getValue()); 
      Log.e(TAG, "======="+postSnapshot.child("name").getValue()); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
     // Failed to read value 
     Log.e(TAG, "Failed to read app title value.", error.toException()); 
    } 
}); 
+0

Sadece doğrudan veri anlık görüntüsünü kullanabilir miyim, çocuk ("email"). GetValue()? Yani, datasnapshot.getChildren() –

+1

kullanmadan demek istemiyorum, –

İlgili konular