如何从onDataChange方法中获取数据?

时间:2017-09-25 02:36:47

标签: android firebase firebase-realtime-database

情境:我想将my参数中的 url 与从firebase实时数据库中检索到的 url 进行比较。然而,检索工作,我不知道如何在我的if-else语句中从String比较中获取布尔值,其中我得到一个错误:“无法将值赋给最终变量'bool'”。 / p>

compare()代码

private boolean compare(String url) {
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
    final String newUrl = url;
    final boolean bool = false;

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getChildrenCount() > 0) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
                    if (executiveOrder.getUrl().equals(newUrl)) {
                        bool = true;
                    } else {
                        bool = false;
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
        }
    });

    return bool;
}

4 个答案:

答案 0 :(得分:0)

错误告诉你是什么问题。您正在尝试为最终变量赋值。尝试直接返回true或false。但请注意firebase调用是异步的,这意味着它可能会返回方法底部的默认值。

private boolean compare(String url) {
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
    final String newUrl = url;
    final boolean bool;

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getChildrenCount() > 0) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
                    if (executiveOrder.getUrl().equals(newUrl)) {
                        bool = true;
                    } else {
                        bool = false;
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
        }
    });

    if(bool!=null)        < Add a condition to check if bool is null or not
    return bool;
    else return false;
}

答案 1 :(得分:0)

使变量bool成为类中的全局变量并删除final关键字,以便您可以从方法内的任何位置读取和写入值。

答案 2 :(得分:0)

您无法为最终变量指定新值。

如果要访问内部类中的外部类变量,则必须将其声明为final。

一种简单但不优雅的方法是声明一个大小为1的布尔数组。

mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
final String newUrl = url;
final boolean[] bool = new boolean[1];   //boolean array of size 1

mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.getChildrenCount() > 0) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
                if (executiveOrder.getUrl().equals(newUrl)) {
                    bool[0] = true;   //access the bool value like this
                } else {
                    bool[0] = false;
                }
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
    }
});

顺便说一句,你犯了一个大错误。你的代码会一直都是假的。

Firebase数据库方法是异步的,意味着它们在一个单独的线程中执行,因此我们无法阻止何时从数据库中检索数据。这取决于你的互联网速度。

所以你必须在onDataChange方法中调用适当的方法。示例......

private boolean compare(String url) {
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch");
    final String newUrl = url;

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getChildrenCount() > 0) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class);
                    boolean bool = executiveOrder.getUrl().equals(newUrl);
                    doSomething(bool); //This method will handle the logic
                }
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e("Executive Order", "The read failed: " + databaseError.getDetails());
        }
    });
}

答案 3 :(得分:0)

如果要在onDataChange方法中使用变量,请在onDataChange方法中编写要对该变量执行的所有过程。此方法应将String作为参数(因为我们大多从firebase接收值作为字符串)。现在,在onDataChange方法中调用此方法,并将onDataChange的变量作为该方法的参数传递。

例如:

public void onDataChange(DataSnapshot dataSnapshot) {
   String firebaseVariable=dataSnapshot.getValue().toString();
   methodToProcess(firebaseVariable);
}

methodToProcess(String firebaseVariable){
//Your processing here
}