我来自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"
}
-
-
-
-
}
答案 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]