我在从数据库填充ListView.builder中的ListTile时遇到问题

时间:2019-06-23 19:22:39

标签: android listview flutter

我无法从数据库中填充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中获取结果?

3 个答案:

答案 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