首页 > 解决方案 > Firebase 数据库查询返回错误结果

问题描述

我有一个 Android Studio 应用程序,它查询用户并根据用户登录凭据(电子邮件)提取用户信息。因此,我将电子邮件从一项活动(登录)传递到另一项活动(个人资料)。在 ProfileActivity 是我查询 Firebase 数据库的地方,我使用用户电子邮件地址来提取特定的用户信息,例如:全名、职业、地址等。这是我的数据库的结构:

user-registration-app
   users
      -Lu8jvjlDWKbgK1ibeku
         email: johndoe@gmail.com
         fullname: John Doe
         address: 1234 nw thistreet
         profession: developer
 -Lu8jvjlDWKbgK1ibeku
         email: janed@gmail.com
         fullname: Jane d
         address: 3444 nw thistreet
         profession: diver

因此,在个人资料活动中,我创建了对“用户”的引用,然后orderbychild()电子邮件等于 johndoe@gmail.com,但返回了一些奇怪的地址(内存地址)。

Intent intent = getIntent();
String email = intent.getStringExtra("email");

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userRef = rootRef.child(USERS);
Log.v("EMAILADD", String.valueOf(userRef.orderByChild("email").equalTo(email)));

在访问 orderByChild("email") 之前是否需要访问密钥 ID?任何帮助表示赞赏。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


但正在返回一些奇怪的地址(内存地址)

这是预期的行为,因为您尝试记录 Firebase 查询对象的字符串表示形式。

userRef.orderByChild("email").equalTo(email)

返回Firebase 实时数据库 Query类型的对象。

如果要获取与该查询对应的值,则应将该查询保存到变量并使用侦听器,如以下代码行所示:

Query query = userRef.orderByChild("email").equalTo(email);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String email = ds.child("email").getValue(String.class);
            Log.d(TAG, email);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

推荐阅读