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

Posted

技术标签:

【中文标题】Android Firebase,只需获取一个子对象的数据【英文标题】:Android Firebase, simply get one child object's data 【发布时间】: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 仪表板”中。

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

【问题讨论】:

【参考方案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); 它会显示 DataSnapshotkey="", 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)  
            );

【讨论】:

以上是关于Android Firebase,只需获取一个子对象的数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 按值对类数组进行排序

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

Firebase 数据库会获取所有数据然后对其进行限制吗?

Firebase 列表查询 (Android)

如何将子firebase数据库中的特定名称获取到recyclerview?

从 firebase (Swift) 获取子节点