【问题标题】:Firebase - retrieving data by value to an outside variableFirebase - 按值将数据检索到外部变量
【发布时间】:2018-10-29 15:20:30
【问题描述】:

我有一个关于 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];
}

【问题讨论】:

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


    【解决方案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 方法中

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2016-04-22
        • 2018-05-29
        • 1970-01-01
        相关资源
        最近更新 更多