按子值获取对象

时间:2016-06-24 16:53:46

标签: android firebase firebase-realtime-database

我的firebase数据库如下所示:

{
     "users": {
          "-KL2IIz4jasq1kjdM-LA": {
               "id": "12345",
               "name": "peter",
               "email": "peter@gmail.com"
          }
          "-KL2Idasdsf34kjdM-LA": {
               "id": "45356",
               "name": "joe",
               "email": "joe@gmail.com"
          }
     }
}

现在我需要通过他的身份“45356”得到乔。我该如何存档?

我现在只能通过他的$ userId“-KL2Idasdsf34kjdM-LA”来获取他

2 个答案:

答案 0 :(得分:3)

虽然@adolfosrs的答案有效,但我建议您更改数据结构。如果您的用户拥有自然ID,则应将其存储在该ID下。

{
   "users": {
      "12345": {
           "name": "peter",
           "email": "peter@gmail.com"
      }
      "45356": {
           "name": "joe",
           "email": "joe@gmail.com"
      }
   }
}

这允许使用(固定性能)直接查找加载它们:

mDatabase.child("users").child("45356").addListenerForSingleValueEvent(
    new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //data will be available on dataSnapshot.getValue();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "error:", databaseError.toException());
        }
});

无论您拥有多少用户,这都将具有固定的性能。随着用户数量的增加,查询会变慢,因此会影响可扩展性。

答案 1 :(得分:2)

mDatabase.child("users").orderByChild("id").equalTo("45356").addListenerForSingleValueEvent(
    new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                //data will be available on userSnapshot.getValue();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "error:", databaseError.toException());
        }
});