Android Firebase,简单获取一个子对象的数据

Android Firebase, simply get one child object's data

我一直在寻找一种方法来在 Android Firebase 中获取一个子对象的数据。

我发现了类似 的东西。所有解决方案都建议使用 "ChildEventListener",但是我现在需要获取此数据,而不是在移动、删除、更新等时获取。

我的数据以字符串形式保存在 https://.firebaseio.com/users//creation 中。我认为必须有一些简单的方法来访问它而无需做太多事情,因为如果我将确切的 URL 复制到我的浏览器,我可以在我的 [=21] 中看到:'creation: "2015/05/31 21:33:55"' =].

我如何在没有监听器的情况下访问它?

Firebase 侦听器会为初始数据和任何更改触发。

如果您希望同步集合中的数据,请使用 ChildEventListener。如果您要同步单个对象,请使用 ValueEventListener。请注意,在这两种情况下,您都不是 "getting" 数据。您正在同步它,这意味着回调可能会被多次调用:对于初始数据以及每当数据更新时。

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

In the example above, the value event will fire once for the initial state of the data, and then again every time the value of that data changes.

请花点时间完成快速入门。整个过程不应超过 15 分钟,这样您就可以避免很多头疼和问题。 Firebase Android Guide is probably a good next destination, for this question specifically: https://firebase.google.com/docs/database/android/read-and-write

您不直接读取值。可以用.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

我这样存储数据:

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

只需获取特定的节点数据,它的工作对我来说非常完美

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