2015-06-01 2 views
36

Я искал способ получить данные одного дочернего объекта в Android Firebase.Android Firebase, просто получить данные одного дочернего объекта

Я нашел такие вещи, как Firebase retrieve child Android. Все решения предлагают использовать «ChildEventListener», однако мне нужно получить эти данные в данный момент, а не когда они будут перемещены, удалены, обновлены и т. Д.

Мои данные хранятся в https: //.firebaseio.com/users//creation как строка. Я считаю, что должен быть какой-то простой способ получить доступ к этому без необходимости делать слишком много, потому что, если я скопирую точный URL-адрес в мой браузер, я могу увидеть: «создание:« 2015/05/31 21:33:55 »' прямо в моей «Firebase Forge Dashboard».

Если кто-то знает, как получить доступ к этому без слушателя для изменения, которое было бы оценено!

Спасибо!

ответ

44

Пожарные пожарные извещатели как для исходных данных, так и для любых изменений.

Если вы хотите синхронизировать данные в коллекции, используйте ChildEventListener. Если вы хотите синхронизировать один объект, используйте ValueEventListener. Обратите внимание, что в обоих случаях вы не получаете данные. Вы синхронизируете это, что означает, что обратный вызов может вызываться несколько раз: для исходных данных и всякий раз, когда данные обновляются.

Это покрытие: Firebase's quickstart guide for Android. Соответствующий код и процитировать:

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

В приведенном выше примере, событие значения будут срабатывать один раз для начального состояния данных, а затем снова каждый раз, когда значение этого изменения данных.

Пожалуйста, потратьте несколько минут, чтобы пройти этот быстрый старт. Это не должно занимать более 15 минут, и это избавит вас от большого количества царапин и вопросов. Firebase Android Guide, вероятно, хороший следующий пункт назначения, для этого вопроса конкретно: https://firebase.google.com/docs/database/android/read-and-write

+1

Спасибо! Вы очень помогли! – 26hmkk

+0

Спасибо, работаю идеально. –

17

Вы прямо не читаете значение. Вы можете установить его с помощью .setValue(), но на ссылочном объекте нет .getValue().

Вы должны использовать слушателя. Если вы просто хотите прочитать значение один раз, вы используете ref.addListenerForSingleValueEvent().

Пример:

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

    } 
}); 

Источник: https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once

+2

Это ответ, который более конкретно отвечает на вопрос в том, что нет простой одной линии кода для извлечения бит данных в базе данных firebase только один раз, например «.getValue()». Затем он рассказывает, как вы должны это делать, «.addListenerForSingleValueEvent» со ссылкой. Примечание. «FirebaseError» обесценивается в более общий «DatabaseError». – Androidcoder

8

хранить мои данные так:

accountsTable -> 
    key1 -> account1 
    key2 -> account2 

для того, чтобы получить объект данных:

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

просто принести конкретный узел данные и его работа идеально подходят для меня

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

Могу ли я напрямую использовать datasnapshot, child («email»). GetValue()? , я имею в виду без использования datasnapshot.getChildren() –

+1

нет, это невозможно, –

Смежные вопросы