如何在安卓中查询Firebase实时数据库 "SELECT column values FROM Table"



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

我的Firebase实时数据库中有以下结构。我正在尝试找到一种方法来构建查询,通过该查询,我可以获取有"服务提供商"的国家/地区列表。

使用 SQL,我可以很容易地写这个:从地址中选择不同的国家;

我不想返回所有"服务提供商"对象,因为可能有数千个!我只想要一个包含国家/地区的字符串列表,最好是 DISTINCT。

示例:如果美国有 3 家服务提供商,加拿大有 5 家,法国有 4 家,那么我的查询将返回 ["美国"、"加拿大",法国"]。

"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"
    }
       -
       -
       -
       -
  }
如果美国有 3 家服务提供商,加拿大有 5 家,法国

有 4 家,那么我的查询将返回 ["美国"、"加拿大",法国"]。

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

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

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

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

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);

日志中的输出将是:

[USA, Canada, France]

最新更新