【问题标题】:Android Firebase, simply get one child object's dataAndroid Firebase,只需获取一个子对象的数据
【发布时间】:2015-08-14 09:29:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    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

    【讨论】:

    • 谢谢!你帮了大忙!
    • note getValue 有另一个用于解析对象的重载。例如User user = snapshot.getValue(User.class);
    • 它会显示 DataSnapshot{key="", value=""} 所以我们在这里定义 snapshot.getValue(User.class);
    • Android Firebase SDK 中有一个错误会强制您监听所有子事件,例如 childAdded、childDeleted、childChanged 和 childMoved。在 iOS 和 Web Firebase SDK 中,您可以监听特定的子事件,例如仅添加的子事件。强制收听所有事件意味着您的账单中下载数据的成本最高。希望 Android 团队能修复此限制并与其他平台保持一致。
    • 所有 SDK 都会下载您收听位置的所有数据。仅侦听child_added、侦听所有child_ 事件或侦听value 之间的有线流量没有区别。顺便说一句:我不知道这个评论与这个问题有什么关系,也不知道你为什么不赞成我的回答。
    【解决方案2】:

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

    【讨论】:

    • 这个响应更具体地回答了这个问题,因为没有简单的一行代码方法可以只检索一次 Firebase 数据库中的一些数据,例如“.getValue()”。然后,它会告诉您如何操作,“.addListenerForSingleValueEvent”,并附有参考。注意“FirebaseError”已被贬低为更通用的“DatabaseError”。
    【解决方案3】:

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

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

    【讨论】:

    • 我只能直接使用 datasnapshot,child("email").getValue() 吗? ,我的意思是不使用 datasnapshot.getChildren()
    • 当手动更改数据库中的某些内容时,它会重复一个循环。当我更改数据库中的几个值时,它显示多次相同的值
    • 如果我把它显示空指针异常: txtmsg.append(postSnapshot.child("name").getValue());什么是解决方案。我将此代码用于多种类型,但代码的每个解释都显示空异常
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2019-05-31
      • 2017-08-26
      相关资源
      最近更新 更多