Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:Firebase查询值中的单个单词_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Android: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);

我想在我的应用程序项目中使用Firebase实时数据库。我想检查数据库中是否存在用户填写的单词

这是我的数据库:

这是我的密码:

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
}
这种数据结构的优点是:

  • 根据定义,每个城市都是独一无二的,因为钥匙的位置必须是独一无二的。也就是说,伦敦不可能在这里住两次
  • 每个城市现在都存储为单独的属性,这意味着您可以单独查询它
  • 例如,如果您有一个say
    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次旅行都将花费相同的时间。