【问题标题】:How to query Firebase Realtime database in Android ex. "SELECT column values FROM Table"如何在 Android ex 中查询 Firebase 实时数据库。 “从表中选择列值”
【发布时间】:2019-03-24 13:02:11
【问题描述】:

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

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

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

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

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

"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"
    }
       -
       -
       -
       -
  }

【问题讨论】:

  • 对象beanth Service-Providers -> PUSH_ID 是一个contry 对象?
  • @AlexMamo 不,它是“服务提供者”对象,它包含一个地址对象,以及其他字符串变量和数组。国家/地区是 Address 对象中的一个字段。
  • 所以你需要列出Service-Providers 一个国家等于某物的对象?这是正确的吗?
  • 不,那很容易...我想知道哪些国家/地区有“服务提供商”。示例:如果美国有 3 个服务提供商,加拿大有 5 个,法国有 4 个,那么我的查询将返回 ["USA","Canada",France"]。

标签: android firebase firebase-realtime-database


【解决方案1】:

如果美国有 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多