首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我无法从Firebase数据库检索布尔数据

我无法从Firebase数据库检索布尔数据
EN

Stack Overflow用户
提问于 2017-05-17 02:52:11
回答 2查看 3.1K关注 0票数 1

我正在尝试创建一个Android聊天应用程序。在这种背景下,我试图让人们相互交友(一个经典)。但我无法从Firebase数据库中检索布尔数据。它总是返回false/可能null。检查我的Firebase后端;

代码语言:javascript
运行
复制
friends{
 552nQquUrtSgbVVLgXxfxOh6SL52{
      NuJohj7nalWnpiMfC1zl3r77QDt2: true
      vIYkKWAWwKTRD4NQfixzcNnfk6X2: true
   }
}     

我的Android代码在下面;

代码语言:javascript
运行
复制
 public boolean checkFriend(final String uID){
    mDatabase = FirebaseDatabase.getInstance().getReference("friends");
    mDatabase.child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
           ret= (Boolean) snapshot.child(uID).getValue();               
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i("HATA OLUŞTU!","FriendManager checkFriend'de veri tabanı bağlantısı hatası oluştu."+ databaseError);
        }
    });
    Log.i("Database", mDatabase.child(user.getUid()).toString()+" +++ "+uID+" ++++ "+ ret.toString());
    return ret;
}

我的小猫在下面

代码语言:javascript
运行
复制
05-17 03:40:35.803 22488-22488/com.furkan.profil I/Database: https://profil-95859.firebaseio.com/friends/552nQquUrtSgbVVLgXxfxOh6SL52 +++ 539vt6Cwi0Y4dF3qmgI6LN1kJJo1 ++++ false
05-17 03:40:35.805 22488-22488/com.furkan.profil I/Database: https://profil-95859.firebaseio.com/friends/552nQquUrtSgbVVLgXxfxOh6SL52 +++ NuJohj7nalWnpiMfC1zl3r77QDt2 ++++ false
05-17 03:40:35.805 22488-22488/com.furkan.profil I/Database: https://profil-95859.firebaseio.com/friends/552nQquUrtSgbVVLgXxfxOh6SL52 +++ vIYkKWAWwKTRD4NQfixzcNnfk6X2 ++++ false

`

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-17 03:05:02

return ret将在onDataChange之前运行。return ret不要等到onDataChange()onCancelled()完成,因为它们在不同的线程中运行

代码语言:javascript
运行
复制
mDatabase.child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        // this will run in different thread 
        ret = (Boolean) snapshot.child(uID).getValue(); // the value that from Firebase is here
    }
});
// this will run before onDataChange
return ret;   

所以你需要改变你的功能

代码语言:javascript
运行
复制
public void checkFriendThenDoSomeThing(final String uID){
    mDatabase.child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
           ret= (Boolean) snapshot.child(uID).getValue(); 

           // DO SOMETHING after get ret from Firebase
        }
        ...
    });
}

======

如果要从另一个调用 checkFriend(...),则需要:

首先,为Listener声明一个接口

代码语言:javascript
运行
复制
public interface CheckFriendSuccessListener {
    void onSuccess(boolean value);
}

Listener放到您的函数中,如

代码语言:javascript
运行
复制
public void checkFriend(final String uID, CheckFriendSuccessListener onCheckFriendSuccessListener){
    mDatabase.child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            boolean ret= (Boolean) snapshot.child(uID).getValue();
            onCheckFriendSuccessListener.onSuccess(ret);
        }
    });
}

然后当您调用checkFriend时

代码语言:javascript
运行
复制
checkFriend("someUserID", new CheckFriendSuccessListener() {
    @Override
    public void onSuccess(boolean value) {
         // DO SOMETHING after check friend successful
    }
});
票数 1
EN

Stack Overflow用户

发布于 2017-05-17 03:03:14

尝试在ret方法中返回onDataChange,如下所示:

代码语言:javascript
运行
复制
@Override
public void onDataChange(DataSnapshot snapshot) {
    ret= (Boolean) snapshot.child(uID).getValue();
    Log.i("Database", mDatabase.child(user.getUid()).toString()+" +++ "+uID+" ++++ "+ ret.toString());
    doStuff(ret); // user ret here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44014702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档