【问题标题】:Firebase Database Query Returning Wrong ResultsFirebase 数据库查询返回错误结果
【发布时间】:2019-11-21 16:38:57
【问题描述】:

我有一个 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?任何帮助表示赞赏。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    但是返回了一些奇怪的地址(内存地址)

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

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

    返回一个Firebase real-time database 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);
    

    【讨论】:

    • 如果电子邮件是唯一的怎么办...我还需要遍历数据集吗?如果我知道返回单个数据是否有更简单的方法
    • 是的,dataSnapshot 对象包含用户对象列表。即使只有一个结果,dataSnapshot 也会包含一个结果列表。不,那里没有。这是最简单的。
    猜你喜欢
    • 2014-12-14
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多