Флаттер, Как мгновенно выполнить поиск в базе данных sqflite?

#flutter #sqlite #dart #sqflite

Вопрос:

Когда я ищу какого-нибудь поэта, он всегда дает мне первые записи. он не показывает точную запись, которую я ищу.

Мои задачи:

TextEditingController _searchInputController = TextEditingController();

список var = [];

var filteredList = [];

bool doItJustOnce = ложь;

 void _filterList(value) {
setState(() {
  filteredList = list
      .where((text) => text.name.toLowerCase().contains(value.toLowerCase())).toList();
});}
 

Текстовое поле, через которое я ищу нужную запись

  TextField(          
    onChanged: (value) {
                    setState(() {
                      // _filterList(value);
                    });
                  },
                ),
 

Будущий строитель

  FutureBuilder<List<Poets>>(
            //we call the method, which is in the folder db file database.dart
            future: DatabaseHelper.instance.getPoets(),
            builder: (BuildContext context, AsyncSnapshot<List<Poets>> snapshot) {
              if (snapshot.hasData) {
                if (!doItJustOnce) {
                  //You should define a bool like (bool doItJustOnce = false;) on your state.
                  list = snapshot.data!;
                  filteredList = list;
                  doItJustOnce = !doItJustOnce; //this line helps to do just once.
                }
                return ListView.builder(
                  padding: EdgeInsets.symmetric(horizontal: 0, vertical: 7),
                  physics: BouncingScrollPhysics(),
                  reverse: false,
                  //Count all records
                  itemCount: snapshot.data!.length,
                  // itemCount: filteredList.length,    // snapshot.data!.length,    //filterLis.length,
                  //all the records that are in the Student table are passed to an item Poet item = snapshot.data [index];
                  itemBuilder: (BuildContext context, int index) {
                    Poets item = snapshot.data![index];
                    //delete one register for id
                    return Dismissible(
                      key: UniqueKey(),
                      background: Container(
                        color: Colors.red,
                        child: Padding(
                          padding: const EdgeInsets.fromLTRB(338, 30, 0, 0),
                          child: Text(
                            'Delete',
                            style: TextStyle(
                                color: Colors.white,
                                fontSize: 20,
                                fontWeight: FontWeight.bold),
                          ),
                        ),
                      ),
                      onDismissed: (direction) {
                        setState(() {
                          DatabaseHelper.instance.remove(item.id);
                        });
                      },
                      //Now we paint the list with all the records, which will have a number, name, phone
                      child: Card(
                        elevation: 15.0,
                        color: Colors.white12,
                        child: Container(
                          decoration: BoxDecoration(
                            // color: Color.fromRGBO(64, 75, 96, .9,),
                            color: Colors.white70,
                            borderRadius: BorderRadius.only(
                              topLeft: Radius.circular(20.0),
                              topRight: Radius.circular(20.0),
                              bottomLeft: Radius.circular(20.0),
                              bottomRight: Radius.circular(20.0),
                            ),
                          ),
                          child: ListTile(
                            leading: CircleAvatar(
                              child: Text(item.id.toString()),
                              backgroundColor: Color.fromRGBO(
                                64,
                                75,
                                96,
                                .9,
                              ),
                              foregroundColor: Colors.white,
                            ),
                            title: Text(
                              item.name,
                              style: TextStyle(fontWeight: FontWeight.bold),
                            ),
                            subtitle: Text(item.f_name),
                            trailing: Text(item.serial_no.toString()),

                            //If we press one of the cards, it takes us to the page to edit, with the data onTap:
                            //This method is in the file add_editclient.dart
                            onTap: () {
                              Navigator.of(context).push(MaterialPageRoute(
                                  builder: (context) => AddEditClient(
                                        true,
                                        //Here is the record that we want to edit
                                        poet: item,
                                      )));
                            },
                            // onLongPress: () {
                            //   setState(() {
                            //     DatabaseHelper.instance.remove(item.id);
                            //   });
                            // },
                          ),
                        ),
                      ),
                    );
                  },
                );
              } else {
                return Center(child: CircularProgressIndicator());
              }
            },
          ),
 

Мой вопрос в том,как выполнить поиск в базе данных sqflite, пожалуйста, помогите мне.

Комментарии:

1. вы можете использовать метод query() или rawQuery (), эти методы возвращают список<Карта>, где длина списка-общее количество строк. каждая карта имеет имя столбца в качестве ключа и данные столбца в качестве значения.

2. Трудно ответить на многие несвязанные вопросы. Можете ли вы отредактировать и разделить их?

3. Да, я отредактировал, пожалуйста, теперь попытайтесь мне помочь

Ответ №1:

вы можете использовать этот пакет sqflite, который очень упростит вашу задачу на стороне запроса. вы можете найти пример в его репозитории(GitHub). или вы можете попробовать это,

 Future getSearch async(){try {
  var mapList = await DbHelper.getTaskDetail(
      table: 'CustomerDetails', where: 'name= joe');

  if (mapList != null amp;amp; mapList.isNotEmpty) {
    yourlist.clear()
    yourlist
        .addAll(mapList.map((e) => yourmodel.fromJson(e)).toList());
  }
}catch(Exception e){
}}

 static Future<List<Map<String, dynamic>>?> getTaskDetail(
  {required String table,
  String? query,
  String? orderBy,
  String? where,
  int? limit}) async {
final db = await instance.taskDatabase;
return db?.query(table, orderBy: orderBy, limit: limit, where: where);}
 

поместите свой результат в setState().

Комментарии:

1. Прости! Не совсем ясно. Где поместить результат в setState()?