#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()?