如何在Android ex中查询Firebase Realtime数据库。 “从表中选择列值”

时间:2019-03-24 13:02:12

标签: android firebase firebase-realtime-database

我来自SQL DB背景,所以我不知道使用Firebase实时数据库是否可以进行这种查询。

我的Firebase实时数据库具有以下结构。我试图找到一种构造查询的方法,通过该方法可以获取其中有“服务提供者”的国家/地区的列表。

使用SQL,我可以很容易地写成这样:SELECT DISTINCT Country FROM Address;

我不想返回所有“服务提供者”对象,因为可能有成千上万个对象!我只想要一个包含国家(最好是DISTINCT)的字符串列表。

示例:如果美国有3个服务提供商,加拿大有5个服务提供商,法国有4个服务提供商,那么我的查询将返回[“ USA”,“ Canada”,France“]。 / p>

"Service-Providers" : {
    "PUSH_ID" : {
      "address" : {
        "area" : "ddd",
        "city" : "Berlin",
        "country" : "Germany",
        "lat" : 0,
        "lng" : 0
           },
      "description" : "Shop",
      "firstName" : "fn",
      "lastName" : "ln",
      "phoneNumbers" : [ "123" ],
      "serviceCategory" : "mixed",
      "uid" : "PUSH_ID"
    }
       -
       -
       -
       -
  }

1 个答案:

答案 0 :(得分:2)

  

如果在美国有3个服务提供商,在加拿大有5个,在法国有4个,那么我的查询将返回[“ USA”,“ Canada”,France“]。

您无法使用实际的数据库结构来实现这一目标。因此,在这种情况下,您应该创建一个Country对象,并通过添加一个名为countries的新节点来对数据库结构进行一些更改。因此,您的新节点应如下所示:

Firebase-root
   |
   --- countries
         |
         --- pushedId
         |     |
         |     --- name: USA
         |     |
         |     --- providerService: 3
         |
         --- pushedId
         |     |
         |     --- name: Canada
         |     |
         |     --- providerService: 5
         |
         --- pushedId
               |
               --- name: France
               |
               --- providerService: 4

现在,每次在Service-Providers节点中添加新地址时,只需将providerService属性的数量增加一即可。就是这样!

要获取国家/地区列表,只需使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference countriesRef = rootRef.child("countries");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> countries = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String country = ds.child("name").getValue(String.class);
            countries.add(country);
        }

        //Do what you need to do with your list
        Log.d(TAG, list.toString());
    }

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

您的logcat中的输出将是:

[USA, Canada, France]