从Firebase返回单个值

时间:2018-02-19 20:56:50

标签: java android firebase firebase-realtime-database

当我想从Firebase数据库获取值并从方法返回值时,我遇到了问题。

我知道它是异步的,onDataChange是在" return"之后执行的。从一个方法中得到的价值,我发现了很多关于这个问题的主题,但是我无法找到返回它的必须做的事情。

这是我的简单方法:

private int getScore(String word) {
    Log.e("DTAG", "order 1");
    String userId = getFirebaseUserId();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");

    rootRef.addListenerForSingleValueEvent(
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                  oldScore = Integer.parseInt(dataSnapshot.getValue().toString());
                    Log.e("DTAG", "order 3");
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            });
    Log.e("DTAG", "order 2");
return oldScore;
}

2 个答案:

答案 0 :(得分:1)

既然你知道它是异步的,那就意味着你不知道什么时候会完成它。

解决问题的几种方法是:

  1. 回调(最简单,因为不需要库)
  2. 活动巴士
  3. 可观察
  4. 第一个选项回调:

    您可以创建自己的回调,例如:

    interface OnCompletion {
    
        onComplete(object: Object)
    
        onFailure(message: String)
    
    }
    

    然后在方法中使用该回调:

    private void getFromDb(String word, completion: onCompletion){
        Log.e("DTAG", "order 1");
        String userId = getFirebaseUserId();
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");
    
        rootRef.addListenerForSingleValueEvent(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
    
                     completion.onComplete('Pass something');
    
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                         completion.onFailure('Pass something');
                    }
                });
    }
    

    然后你称之为:

            getFromDb("test", new OnCompletion() {
            onComplete(object: Object) {
               //Cast it and access the data here
            }
    
            onFailure(message: String) {
              //access the data here
            }
    

    } ){

答案 1 :(得分:0)

试试这个。

 private void getFromDb(String word){
    Log.e("DTAG", "order 1");
    String userId = getFirebaseUserId();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");

    rootRef.addListenerForSingleValueEvent(
            new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                  getScore(Integer.parseInt(dataSnapshot.getValue().toString()));
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
}

private int getScore(int score){
    Log.v("score",String.valueOf(score);
    return score
}