【问题标题】:Read data from Firebase从 Firebase 读取数据
【发布时间】:2018-04-11 05:41:42
【问题描述】:

我正在为我的 Android 应用程序使用 Firebase,我想读取数据。特别是我想选择一个具有特定 ID 的用户。当我使用调试器时,代码似乎没有执行 onDataChange() 指令。

private User readUserById(){
    final User u = new User("","","");
    Query query = mDatabaseReferences.child("users").orderByChild("id").equalTo(id);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()){
                u.setId(ds.child("id").getValue(User.class).getId());
                u.setNumber((ds.child("number").getValue(User.class).getNumber()));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return u;
}

private void initFirebase() {
    FirebaseApp.initializeApp(this);
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mDatabaseReferences = mFirebaseDatabase.getReference();
}

 public void sendCode(View v){

    id= id.getText().toString();
    readUserById();
        phoneNumber = phoneText.getText().toString();
        if (phoneNumber.equals("") || id.equals("")) {
            Toast t = Toast.makeText(this, "Please insert a nickname and a valid phone number", Toast.LENGTH_LONG);
            t.show();
        } else {
            setUpVerificationCallbacks();

            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    phoneNumber,
                    60,
                    TimeUnit.SECONDS,
                    this,
                    verificationCallbacks
            );
        }
  //  }

}

使用调试器,我发现 'id' 值是正确的。

我为 sendCode() 使用了 Firebase 文档,用户注册工作正常,就像发送短信一样。我想检查昵称是否已经存在,并且该值在'id' Textview 中。我通过一个按钮调用 sendCode()。

我尝试过这种方式,但不起作用。使用调试器运行用户的结果为null

private User readUserByName(){
    final User[] user = {new User()};
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    ref.child("users").child(nick).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                user[0] = dataSnapshot.getValue(User.class);
                Log.d("Tag", user[0].toString());
            }
            else
                Log.e("Tag","No such user exists");
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return user[0];
}

This is how I save the User

I've launched the app with the debugger

【问题讨论】:

  • 请添加您的数据库结构。
  • 我添加了结构

标签: database android-studio firebase firebase-realtime-database listener


【解决方案1】:

假设 users 节点是您的 Firebase 根的直接子节点,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference testRef = rootRef.child("users").child("test");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String id = dataSnapshot.child("id").getValue(String.class);
        String idName = dataSnapshot.child("idName").getValue(String.class);
        String number = dataSnapshot.child("number").getValue(String.class);
        Log.d("TAG", id + " / " + idName + " / " + number);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
testRef.addListenerForSingleValueEvent(eventListener);

输出将是:

test / f70eb... / number

【讨论】:

  • 它不起作用它仍然不执行onDataChange()我添加了一个新图像
  • 你的 logcat 有什么?看到上面的输出了吗?
  • 什么都没有,似乎(我认为)onDataChange() 没有执行
  • 全班都给我鞋。您的代码中还有其他问题。
【解决方案2】:

假设:

  1. 直接在根节点下的节点“用户”。
  2. 您已经知道用户的 id,并且此 id 包含 User.class 下的所有信息
  3. 您只想读取用户(如果数据库中存在)。
  4. 所有 getter 和 setter 都存在于 User.class 中,并且存在 Public 空构造函数

你应该这样做

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();

ref.child("users").ref(id).addListenerforSingleValueEvent(listener);

在监听器的 OnDataChange(DataSnapshot snap);

if(snap.exists()){
      user = snap.getValue(User.class);
     Log.d("Tag",user.toString());
    }
else
      Log.e("Tag","No such user exists");

【讨论】:

  • 您发布的代码甚至在语法上都不正确。为什么使用用户数组?此外,您应该将“nick”放在双引号中。上面的答案仅供参考,你必须有足够的技能在你的代码中实现它
  • Android Studio 在最终用户[]中更改变量用户
猜你喜欢
  • 2020-05-05
  • 1970-01-01
  • 2018-02-17
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多