我一直在寻找一种在Android Firebase中获取一个子对象数据的方法。
我找到了Firebase retrieve child Android之类的东西。所有解决方案都建议使用“ChildEventListener”,但是我需要在此时获取此数据,而不是在移动,删除,更新等时获取此数据。
我的数据以字符串形式保存在https://.firebaseio.com/users//creation中。我认为必须有一些简单的方法来访问它而不需要做太多,因为如果我将确切的URL复制到我的浏览器,我可以看到:'创建:“2015/05/31 21:33:55”'就在我的“Firebase Forge Dashboard”中。
如何在没有听众的情况下访问它?
答案 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) { }
});