53

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

我发现了诸如Firebase 检索子 Android 之类的东西。所有解决方案都建议使用“ChildEventListener”,但是我现在需要获取这些数据,而不是在移动、删除、更新等时获取。

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

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

4

4 回答 4

64

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

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

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

在上面的示例中,value 事件将针对数据的初始状态触发一次,然后在每次该数据的值更改时再次触发。

请花一些时间来完成该快速入门。它不应该花费超过 15 分钟,它可以让你免于许多头疼和问题。Firebase Android 指南可能是一个很好的下一个目的地,专门针对这个问题:https : //firebase.google.com/docs/database/android/read-and-write

于 2015-06-01T02:31:16.317 回答
24

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

于 2016-04-13T23:29:15.823 回答
12

我以这种方式存储我的数据:

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) { }
            });
于 2016-12-19T17:29:51.897 回答
12

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

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());
    }
});
于 2017-02-13T12:29:38.447 回答