Firebase - 按值检索外部变量的数据

时间:2018-05-19 09:50:26

标签: java android firebase asynchronous firebase-realtime-database

我对Firebase实时数据库有疑问。

我正在尝试在我的程序中执行书签选项,允许用户存储他/她最喜欢的页面,但是每当我尝试从我的firebase数据库中检索数据时,在方法返回值之后数据将被恢复

public static boolean checkIfBookmarked(final String title){
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    final DatabaseReference userBookmarks = FirebaseDatabase.getInstance().getReference().child("users")
            .child(user.getUid()).child("bookmarks");
    final boolean[] exists = new boolean[1];
    userBookmarks.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            exists[0] = dataSnapshot.child(title).exists() ;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return exists[0];
}

2 个答案:

答案 0 :(得分:1)

Firebase使用回调方法从服务器获取数据。在您的情况下,return语句将在回调来自Firbase之前执行。您可以尝试将回调方法传递给您的函数,并在触发Firebase的回调时执行该操作。

public static void checkIfBookmarked(final String title, callbackFunction){
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    final DatabaseReference userBookmarks = FirebaseDatabase.getInstance().getReference().child("users")
            .child(user.getUid()).child("bookmarks");
    final boolean[] exists = new boolean[1];
    userBookmarks.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            exists[0] = dataSnapshot.child(title).exists() ;
            //execute your callback function here
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return;
}

选中此项以查看如何将函数作为参数传递。 Passing function as a parameter in java

另一种方法是将代码移动到OnDataChange方法

答案 1 :(得分:0)

您现在无法返回尚未加载的内容。换句话说,您不能简单地在exists[0]方法之外返回数组onDataChange()的第一个元素,因为由于此方法的异步行为,它始终为null。这意味着当您尝试在该方法之外使用该结果时,数据尚未从数据库中完成加载,这就是无法访问的原因。

快速解决此问题的方法是仅在exists[0]方法中使用onDataChange(),或者如果您想在外面使用它,我建议您深入了解异步世界并查看最后一部分我的anwser来自 post ,其中我已经解释了如何使用自定义回调来完成它。您还可以查看此 video ,以便更好地理解。