Android Firebase,只需获取一个子对象的数据

时间:2015-06-01 02:09:33

标签: android firebase firebase-realtime-database

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

我找到了Firebase retrieve child Android之类的东西。所有解决方案都建议使用“ChildEventListener”,但是我需要在此时获取此数据,而不是在移动,删除,更新等时获取此数据。

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

如何在没有听众的情况下访问它?

4 个答案:

答案 0 :(得分:57)

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

如果您正在寻找同步集合中的数据,请使用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) {        
  }
});
  

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

请花一点时间来快速启动。它不应该花费超过15分钟,它将为您节省大量的头脑和问题。对于这个问题,Firebase Android Guide可能是一个很好的下一个目的地:https://firebase.google.com/docs/database/android/read-and-write

答案 1 :(得分:22)

您不直接读取值。您可以使用.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 :(得分:11)

只需获取特定的节点数据,它的工作非常适合我

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

答案 3 :(得分:10)

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

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