获取DataSnapshot的静态方法返回null

时间:2018-01-09 00:37:07

标签: android firebase firebase-realtime-database

我正在构建一个使用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,有什么帮助吗?

3 个答案:

答案 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()做了三件事:

  1. 创建一个监听器
  2. 注册听众
  3. 返回snapshot
  4. 请注意,这些步骤均未设置snapshot的值。您是在其中一个侦听器的方法中设置的,直到getDataSnapshot()返回后才会调用该方法。

答案 2 :(得分:0)

您无法退回尚未加载的内容。 onDataChange()方法被称为异步,这意味着甚至在从数据库获取DataSnapshot对象之前就会调用它。有关详细信息,请参阅此post的答案。

如果您想在DataSnapshot方法之外使用onDataChange()对象,则需要按照该答案的最后解释创建自己的回调。

相关问题