我无法从数据库中填充ListView.builder中的ListTile。 我没有“模型类”,因为我不需要更新删除数据,我只需要简单的查询即可。
我的ExpansionTile具有三个类别,在每个类别中,我需要从db查询。我不知道该如何工作或从db类返回什么才能工作。
child: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemBuilder: (context, i) => ExpansionTile(
title: new Text(
'${categoryName[i]}',
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.normal,
fontWeight: FontWeight.bold,
color: Color.fromRGBO(49, 85, 158, 1)),
),
children: list //final list = new List.generate(17, (i) => "Item ${i + 1}"); --just to populete with dummy items, instad of this i need db data
.map((val) => ListTile(
// leading: Icon(Icons.add),
title: new Row(
children: <Widget>[
new Checkbox(
value: _isCheck,
onChanged: (bool value) {
onChange(value);
}),
new Expanded(child: new Text(val)),
],
)))
.toList(),
),
itemCount: categoryName.length,
),
),
],
),
在我的数据库类中:
Future<List> getAllNotes() async {
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'books.db');
Database database = await openDatabase(path, version: 1);
//var dbClient = await database();
var result = await database.rawQuery('SELECT * FROM $booksTable WHERE $colDescription = ${'Adventure'}');
return result.toList();
}
那么如何编写简单的查询以在ListView / ListTile中获取结果?
答案 0 :(得分:0)
您确实需要提供有关您的问题的更多详细信息。无论如何,我会尝试用我所理解的来回答问题。
假设您有一个表名'booksTable',其中包含3个字段:
bookId | bookName | bookCategory
1 Book A Adventure
2 Book B History
3 Book C Adventure
4 Book D History
确保在DatabaseHelper()
类中创建所有这些数据库函数,这样就不必一次又一次地向db写入逻辑。
现在,您查询的内容将如下所示:
Future<List<String>> getAllNotes(String category) async {
var dbClient = await database();
List<String> bookNames = List<String();
var result = await dbClient.rawQuery("SELECT bookname FROM booksTable WHERE bookCategory = $category");
result.forEach((item) {
bookNames.add(item["bookname"]);
});
return bookNames;
}
这仅在必须对1列进行反序列化时才有效。如果选择了多个列,则必须创建一个模型类。
现在在前视图中,您有两个选择: 1)您可以使用initState在参数中使用类别的bookNames填充列表 2)您也可以使用FutureBuilder填充列表 (这两个选项都必须使用StatefulWidget)
我将在这里向您展示如何使用initState进行操作。如果您想知道如何使用FutureBuilder做到这一点,请在评论中告诉我。
List<String> booksList =List<String>();
var db = DatabaseHelper();
readList() async {
booksList = await db.getAllNotes("Adventure");
}
@override
void initState() {
super.initState();
readList();
}
ListView.builder(
itemBuilder: (context, i) {
Column( crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
ExpansionTile(
title: new Text(
"Adventure Category",
style: TextStyle(
fontSize: 18,
fontStyle: FontStyle.normal,
fontWeight: FontWeight.bold,
color: Color.fromRGBO(49, 85, 158, 1)),
),
ListTile(
title: new Row(
children: <Widget>[
new Checkbox(
value: _isCheck,
onChanged: (bool value) {
onChange(value);
}),
Expanded(child: new Text("${booksList[i]}")),
],
)))
),])}
itemCount: booksList.length,
),
),
],
)
注意:上面的代码中可能有错别字,因为我是在电话上键入的,但是您知道怎么做,对吧?
答案 1 :(得分:0)
所以,我有ListView(具有3个扩展组),它们是从数组中获取的:( List categoryName = ['第1部分:冒险','第2部分:历史记录','第3部分:恐怖'];
然后经过这里:
子:列(
儿童:[
展开(
子级:ListView.builder(
itemBuilder:(上下文,i)=> ExpansionTile(
标题:新文本(
'$ {categoryName [i]}',
),
那部分工作正常,我得到了3个expandeble标题,现在需要从db中填充该孩子的(ListTile)。 以您的示例为例:
readList()异步{ sinsAgainstGod =等待db.getSins(“ Adventure”);
} 我收到错误消息:...“冒险”附近:语法错误.. 并持续获得长度为0的图书清单...
Future<List<String>> getNotes(String category) async {
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'books.db');
Database database = await openDatabase(path, version: 1);
List<String> bookNames = List<String>();
var result = await database.rawQuery("SELECT $colDescription FROM $booksTable WHERE = $category ");
result.forEach((item) {
bookNames.add(item['Category']);
});
return bookNames;
}
这个结果。forEach(item)应该做什么?
答案 2 :(得分:0)
谢谢您的回答,这很有帮助。 你能告诉我为什么我得到20个相同的描述而不是用以下代码识字吗:
Future<List<String>> getSins(String column) async {
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'confession.db');
Database database = await openDatabase(path, version: 1);
List<String> bookNames = List<String>();
for (int i = 0; i < 20; i++) {
var result = await database.rawQuery(
'SELECT * FROM $plannerTable WHERE $colCategory= "Adventure');
bookNames.add((result[0][column].toString()));
}
return bookNames;
}
我想从冒险类中获得所有的成就。 Tnx