【问题标题】:Query to retrieve specific data from Firebase查询以从 Firebase 检索特定数据
【发布时间】:2017-03-19 18:01:36
【问题描述】:

我正在创建一个 Android 应用程序,但遇到了一个问题。为了解释问题,我想展示我的数据库结构

{

 "EXlzg1COUbOhQjwPCGbS1NRdp5H3" : {
    "Contacts" : {
      "Contact1" : value (Contact number)
      "Contact2" : value
      "Contact3" : value
    },
    "name" : "Sagar Khan",
    "phone" : 7276273667
  },


 "OLm7VWsMcGQpterECyhJ8YTSPna2" :  {
    "Contacts" : {
      "Contact1" : value
      "Contact2" : value
      "Contact3" : value
    },
    "name" : "Sameer",
    "phone" : 8412914728
  },
  "TXanCkqtB5PdEogtv8Dzw8y1ngw1" : {
    ""Contacts" : {
      "Contact1" : value
      "Contact2" : value
      "Contact3" : value
    },
    "name" : "Harish",
    "phone" : 7020743544
  },
  "qnDVoc72nXa8XvOH1L39VvqFzKL2" : {
    "Contacts" : {
      "Contact1" : value
      "Contact2" : value
      "Contact3" : value
    },
    "name" : "Harish Shinde"
    "phone":  8149870822
  }
}

这是一个非常短的结构,实际的结构很大 现在我想做的是只获取当前用户节点中存在联系电话的那些用户,并将这些用户显示在 Android 列表中。

例如:

ID 为 EXlzg1COUbOhQjwPCGbS1NRdp5H3 的用户 1 有 3 个联系人

"EXlzg1COUbOhQjwPCGbS1NRdp5H3" : {
    "Contacts" : {
      "Sameer" : 8412914728 (Contact number)
      "Contact2" : value
      "Contact3" : value
    },
    "name" : "Sagar Khan",
    "phone" : 7276273667
  },

现在,当我从我的数据库中获取用户列表并将其显示在我的 Android 应用程序列表中时,我希望只添加那些其联系人号码存在于用户 1 联系人中的用户。

我的问题是我真的不知道如何做到这一点,因为我是 Android 开发和 Firebase 的新手。 Firebase的读写基础我很清楚,但是这样的操作,我不知道怎么做。

我搜索了很多,但找不到任何解决方案或示例。详细的描述对我来说非常好。 ;) 提前致谢。

【问题讨论】:

  • Contacts 的用户创建一个单独的父节点会更容易,例如Contact -> (User ID) -> contact1 ..etc。您可以更轻松地检索数据,并且用户可以存储任意数量的联系人。如果您有兴趣更改当前的数据库结构,我可以发布代码 sn-p 这种方法将如何进行。
  • 是的,请...但是我将如何访问用户节点的属性?
  • 当我将获取用户列表并将其显示在 android 列表中以及当用户单击列表中的特定项目时,进一步的操作将需要访问用户下的选定用户的属性节点......我希望你能理解我想说的话
  • 您的用户节点将是相同的,假设 ID 为 EXlzg1COUbOhQjwPCGbS1NRdp5H3 的用户将在 Users 下有一个子节点(包含姓名和电话号码),该用户的联系人将是使用用户 ID EXlzg1COUbOhQjwPCGbS1NRdp5H3 再次存储在 Contacts 节点中。所以基本上会有两个父节点UsersContacts。你明白我想说的吗?
  • 有什么方法可以通过搜索特定用户的联系电话来获取特定用户的 ID?

标签: android firebase firebase-realtime-database


【解决方案1】:

这是我建议的更改:

这是Users 节点的新数据库结构:

"Users" : {
  "EXlzg1COUbOhQjwPCGbS1NRdp5H3" : {
      "name" : "Sagar Khan",
      "phone" : 7276273667
    },
    ..
}

用户“Sagar Khan”的联系人将存储在另一个名为Contacts的节点中,该用户的用户ID (EXlzg1COUbOhQjwPCGbS1NRdp5H3):

"Contacts" : {
  "EXlzg1COUbOhQjwPCGbS1NRdp5H3" : {
      "Contact1":{
        "name" : "Sameer",
        "phone" : 7276273000
      },
      "Contact2":{
        "name" : "Alice",
        "phone" : 7276273600
      },
      ...
    },
    //other user id with  their contacts
    ...
  }

我怀疑用户 ID(例如:EXlzg1COUbOhQjwPCGbS1NRdp5H3)是从登录用户那里获取的,使用:

mAuth.getCurrentUser().getUid();

因此,要获取登录用户的联系人,您可以像这样查询数据库:

DatabaseReference  mUserContactsRef =  FirebaseDatabase.getInstance().getReference().child("Contacts").child(mAuth.getCurrentUser().getUid(););
mUserContactsRef.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {

          for(DataSnapshot userContact : dataSnapshot.getChildren()){

              Contact contact = userContact.getValue(Contact.class);
              //add each contact to an arraylist and use it to populate a list of contacts

          }

      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
  });

您可以将每个联系人对象添加到 ArrayList 并使用它来填充列表。关键是用户 ID,您可以使用用户 ID 访问与用户相关的任何内容。

这是我推荐的方法,也是我过去成功用于类似场景的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多