Flutter:Firebase基本查询或基本搜索代码

时间:2018-06-15 07:04:48

标签: firebase-realtime-database dart google-cloud-firestore flutter flutter-dependencies

enter image description here

主要概念是显示包含搜索字母的文档sor字段。

搜索栏获取给定的输入,它发送到<a>,但作为回报,没有任何结果,上面的图像是我的数据库结构,试图弄清楚超过一周。

CODE

_firebasesearch()

主要概念是显示包含搜索字母的文档sor字段

搜索栏获取给定的输入,它发送到_firebasesearch(),但是在后面没有任何结果出来,上面的图像是我的数据库结构,试图计算超过一周,

7 个答案:

答案 0 :(得分:7)

这听起来可能是一个荒谬的解决方案,但实际上效果很好,几乎就像SQL中的 Like'%'查询

在TextField中键入值时,在其中where() isGreaterThanOrEqualTowill 将其与大于输入的所有字符串值进行比较,如果您将'Z'连成字符串 最后, isLessThan 将在您的搜索关键字之后结束,您将从firestore获得所需的结果。

// Declare your searchkey and Stream variables first
String searchKey;
Stream streamQuery;

TextField(
              onChanged: (value){
                  setState(() {
                    searchKey = value;
                    streamQuery = _firestore.collection('Col-Name')
                        .where('fieldName', isGreaterThanOrEqualTo: searchKey)
                        .where('fieldName', isLessThan: searchKey +'z')
                        .snapshots();
                  });
    }),

我在 StreamBuilder 中使用了此Stream,它的运行完全符合预期。

限制:

  1. 搜索区分大小写(如果您的数据如 Type Case 一样,可以将searchKey转换为特定大小写)
  2. 您必须从第一个字母开始搜索,而不能从中间一个字母开始搜索

答案 1 :(得分:3)

您不必重建整个流,只需根据您的搜索字符串过滤流中的结果。 快速,不需要重建整个流,不仅从单词的开头找到搜索字符串的出现,而且不区分大小写。

return StreamBuilder(
  stream: FirebaseFirestore.instance.collection("shops").snapshots(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {

    if (snapshot.hasError)  // TODO: show alert
      return Text('Something went wrong');

    if (snapshot.connectionState == ConnectionState.waiting)
      return Column(
        children: [
          Center(
              child: CupertinoActivityIndicator()
          )
        ],
      );

    var len = snapshot.data.docs.length;
    if(len == 0)
      return Column(
        children: [
          SizedBox(height: 100),
          Center(
            child: Text("No shops available", style: TextStyle(fontSize: 20, color: Colors.grey)),
          )
        ],
      );

    List<Shop> shops = snapshot.data.docs.map((doc) => Shop(
        shopID: doc['shopID'],
        name: doc['name'],
        ...
    )).toList();
    shops = shops.where((s) => s.name.toLowerCase().contains(searchString.text.toLowerCase())).toList();
    
    
    return
        Expanded(
          child: ListView.builder(
              padding: EdgeInsets.symmetric(vertical: 15),
              scrollDirection: Axis.vertical,
              shrinkWrap: true,
              itemCount: shops.length,
              itemBuilder: (context, index) {
                return shopRow(shops[index]);
              }
          ),
        );
  },
);

答案 2 :(得分:1)

问题是您希望firestore的结果title is equal to queryText不是title contains queryText

如果您想要搜索功能,可以get and store the firestore documents使用上面存储的模型列表中的变量List<Model> model而不是StreamBuilderimplement search manually

答案 3 :(得分:1)

这是另一个搜索代码,它将在FIREBASE数据库内进行搜索, enter image description here

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database/ui/firebase_animated_list.dart';


class Db extends StatefulWidget {
  @override
  HomeState createState() => HomeState();
}

class HomeState extends State<Db> {
  List<Item> Remedios = List();
  Item item;
  DatabaseReference itemRef;
  TextEditingController controller = new TextEditingController();
  String filter;

  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
    item = Item("", "");
    final FirebaseDatabase database = FirebaseDatabase.instance; //Rather then just writing FirebaseDatabase(), get the instance.
    itemRef = database.reference().child('Remedios');
    itemRef.onChildAdded.listen(_onEntryAdded);
    itemRef.onChildChanged.listen(_onEntryChanged);
    controller.addListener(() {
  setState(() {
    filter = controller.text;
  });
});
  }

  _onEntryAdded(Event event) {
    setState(() {
      Remedios.add(Item.fromSnapshot(event.snapshot));
    });
  }

  _onEntryChanged(Event event) {
    var old = Remedios.singleWhere((entry) {
      return entry.key == event.snapshot.key;
    });
    setState(() {
      Remedios\[Remedios.indexOf(old)\] = Item.fromSnapshot(event.snapshot);
    });
  }

  void handleSubmit() {
    final FormState form = formKey.currentState;

    if (form.validate()) {
      form.save();
      form.reset();
      itemRef.push().set(item.toJson());
    }
  }


@override
void dispose() {
  controller.dispose();
  super.dispose();
}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        centerTitle: true,
        backgroundColor: new Color(0xFFE1564B),
      ),
      resizeToAvoidBottomPadding: false,
      body: Column(
        children: <Widget>\[
          new TextField(
          decoration: new InputDecoration(
          labelText: "Type something"
          ),
          controller: controller,
          ),
          Flexible(
            child: FirebaseAnimatedList(
              query: itemRef,
              itemBuilder: (BuildContext context, DataSnapshot snapshot,
                  Animation<double> animation, int index) {
                return  Remedios\[index\].name.contains(filter) || Remedios\[index\].form.contains(filter) ? ListTile(
                  leading: Icon(Icons.message),
                  title: Text(Remedios\[index\].name),
                  subtitle: Text(Remedios\[index\].form),
                ) : new Container();
              },
            ),
          ),
        \],
      ),
    );
  }
}

class Item {
  String key;
  String form;
  String name;

  Item(this.form, this.name);

  Item.fromSnapshot(DataSnapshot snapshot)
      : key = snapshot.key,
        form = snapshot.value\["form"\],
        name = snapshot.value\["name"\];

  toJson() {
    return {
      "form": form,
      "name": name,
    };
  }
}][1]][1]

答案 4 :(得分:0)

我为时已晚,但我只想分享一些有关如何实现搜索功能而不在我的情况下使用第三方应用程序的信息。我的解决方案是使用firestore进行一些直接查询。这是代码:

Future<List<DocumentSnapshot>> getSuggestion(String suggestion) =>
  Firestore.instance
      .collection('your-collection')
      .orderBy('your-document')
      .startAt([searchkey])
      .endAt([searchkey + '\uf8ff'])
      .getDocuments()
      .then((snapshot) {
        return snapshot.documents;
      });

示例,如果要搜索所有包含“ ab”的关键字,则它将显示所有包含“ ab”的单词(例如abcd,abde,abwe)。如果要进行自动建议搜索功能,可以使用打字头。可以在以下链接中找到:https://pub.dev/packages/flutter_typeahead

祝你好运。

答案 5 :(得分:0)

我找到的解决方案:

List<String> listaProcura = List();
    String temp = "";
    for(var i=0;i<nomeProduto.length; i++) {
      if(nomeProduto[i] == " ") {
        temp = "";
      } else {
        temp = temp + nomeProduto[i];
        listaProcura.add(temp);
      }
    }

“ listaProcura”是列表的名称。 字符串“ temp”是临时字符串的名称。 这样,您会将名称列表保存在Firebase数据库中。 会像这样:

  [0] E
  [1] Ex
  [2] Exa
  [3] Exam
  [4] Examp
  [5] Exampl
  [6] Example
  [7] o
  [8] on
  [9] one

使用您想搜索的单词检索此信息:

await Firestore.instance.collection('name of your collection').where('name of your list saved in the firebase', arrayContains: 'the name you are searching').getDocuments();

这样,如果您搜索“一个”并且名称为“示例一”,则搜索将正确返回。

答案 6 :(得分:-1)

简单快捷。

if (text.length > 1) {
  setState(() {
    tempSearchStore = _listPkh.documents.where((d) {
      if (d['nama'].toLowerCase().indexOf(text) > -1) {
        return true;
      } else if (d['alamat'].toLowerCase().indexOf(text) > -1) {
        return true;
      }
      return false;
    }).toList();
  });
} else {
  setState(() {
    tempSearchStore = _listPkh.documents;
  });
}