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
【讨论】:
谢谢!你帮了大忙! notegetValue
有另一个用于解析对象的重载。例如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.auth.currentUser Android Kotlin 获取刷新令牌