Java Android:Firebase查询值中的单个单词
我想在我的应用程序项目中使用Firebase实时数据库。我想检查数据库中是否存在用户填写的单词 这是我的数据库: 这是我的密码:Java Android:Firebase查询值中的单个单词,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想在我的应用程序项目中使用Firebase实时数据库。我想检查数据库中是否存在用户填写的单词 这是我的数据库: 这是我的密码: private Button button; private FirebaseDatabase database; private DatabaseReference mRef; private TextView tvResult; private EditText et1; et1=(EditText) findViewById(R.id.et1);
private Button button;
private FirebaseDatabase database;
private DatabaseReference mRef;
private TextView tvResult;
private EditText et1;
et1=(EditText) findViewById(R.id.et1);
button=(Button) findViewById(R.id.btn);
tvResult=(TextView) findViewById(R.id.tvResult);
database=FirebaseDatabase.getInstance();
mRef=database.getReference();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
city=et1.getText().toString();
Query query = mRef.child("app").orderByChild("cities").equalTo(city);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
// dataSnapshot is the "issue" node with all children with id 0
String get= dataSnapshot.getValue().toString();
tvResult.setText(get);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
});
正如我所说,用户填写edittext,单击按钮后,如果数据库中有,我想在textview中显示书面城市。不幸的是,Firebase实时数据库中没有类似以下内容的查询:
mRef.child("app").orderByChild("cities").contains(city)
String str1 = dataSnapshot.child("cities").getValue(String.class);
String str2 = "london";
boolean b = str1.toLowerCase().contains(str2.toLowerCase());
但对于小型数据集,有一种解决方法可以帮助您解决此问题,即查询数据库以获取cities
属性的所有值,并使用contains()
方法,如下所示:
mRef.child("app").orderByChild("cities").contains(city)
String str1 = dataSnapshot.child("cities").getValue(String.class);
String str2 = "london";
boolean b = str1.toLowerCase().contains(str2.toLowerCase());
如果您尝试打印
b
的值,您将看到这是true
。但是上面的示例仅适用于非常小的数据集,而不适用于大型数据集,这是因为下载整个对象以在客户端搜索字段是不实际的。在这种情况下,我建议使用第三方搜索服务,如。您在城市中拥有的是一组值:一组值,其中每个值都是唯一的,顺序无关紧要。因此,它是一个具有多个值的单一属性。虽然NoSQL数据库都是关于数据的非规范化,但这实际上是我建议您对其进行规范化的情况之一
在实时数据库中,您通常将数学集建模为以下JSON:
cities: {
london: true,
paris: true,
milan: true,
ny: true,
istanbul: true
}
这种数据结构的优点是:
trips
列表,其中每个trips都可以有一个cities
节点,并且您可以按照我所示的方式对其进行建模,您可以查询包括纽约在内的所有城市:
firebase.database().ref("cities").orderByChild("cities/ny").equalTo(true)
firebase.firestore().collection("trips").where("cities", "array-contains", "ny")
这在技术上是可行的,但由于Firebase实时数据库索引的工作方式,它的性能非常差。有关这方面的更多信息,以及如何对此建模以允许用例的解释,请查看我的答案:
我绝对建议您查看Cloud Firestore。这个用例正是Firestore最近发布了一些重大改进的地方。在Firestore中,您现在可以将数据集存储在阵列中:
["london", "paris", "milan", "ny", "istanbul"]
假设你有一个旅行的集合,每次旅行都有一个字段cities
,其值为上面的数组。您现在可以通过以下方式查询包括纽约在内的行程:
firebase.database().ref("cities").orderByChild("cities/ny").equalTo(true)
firebase.firestore().collection("trips").where("cities", "array-contains", "ny")
与实时数据库不同的是,在Firestore上,此查询的可扩展性非常好。有关这方面的更多信息,请参阅博文。除此之外,另一个选择是更改数据结构以满足您的需要。是的,也许我可以做到。非常感谢。Firebase Cloud Firestore中的问题有什么解决方案吗?没有!请查看更多详细信息。Firestore的官方文档提供了相同的解决方案。谢谢你,弗兰克。我将处理非常大的数据,可能是数千个城市。您建议使用firestore吗?对于实时数据库(只要您在我的链接答案中创建附加数据结构)或firestore,数千不是一个高数字。但是Firestore在这两者之间肯定有更好的可伸缩性,因为它可以水平扩展。也就是说,无论集合中有多少次旅行,阅读10次旅行都将花费相同的时间。