我正在构建一个使用Firebase数据库的Android应用程序,我在应用程序中需要大量的DataSnapshot,所以我决定使用帮助方法来获取DataSnapshot,这里我是如何设法在Helper类中实现它的我创造了:
static FirebaseDatabase database = FirebaseDatabase.getInstance();
static DatabaseReference playersReference = database.getReference().child("players");
static DataSnapshot snapshot;
public static DataSnapshot getDataSnapshot(){
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
snapshot = dataSnapshot;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
playersReference.addListenerForSingleValueEvent(valueEventListener);
return snapshot;
}
但每当我尝试使用该方法时,它会返回null,有什么帮助吗?
答案 0 :(得分:1)
首先,创建一个单独的帮助程序类,它打破对数据库的静态调用,如下所示:
public class FirebaseDbRef {
private static DatabaseReference ref;
private static DatabaseReference getFirebaseDatabase() {
if (ref == null)
ref = FirebaseDatabase.getInstance().getReference();
return ref;
}
public static DatabaseReference getPlayerRef() {
return getFirebaseDatabase().child("player");
}
}
然后在您的activity / fragment中,调用该方法并添加一个侦听器来检索快照:
FirebaseDbRef.getPlayerRef().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//USE SNAPSHOT
}
@Override
public void onCancelled(DatabaseError databaseError) {
databaseError.getMessage();
}
});
确保您的路径正确以访问正确的快照。您始终可以登录进行验证。
答案 1 :(得分:0)
getDataSnapshot()
做了三件事:
snapshot
请注意,这些步骤均未设置snapshot
的值。您是在其中一个侦听器的方法中设置的,直到getDataSnapshot()
返回后才会调用该方法。
答案 2 :(得分:0)
您无法退回尚未加载的内容。 onDataChange()
方法被称为异步,这意味着甚至在从数据库获取DataSnapshot
对象之前就会调用它。有关详细信息,请参阅此post的答案。
如果您想在DataSnapshot
方法之外使用onDataChange()
对象,则需要按照该答案的最后解释创建自己的回调。