Flutter:在 ListView 中查询 SQLite 数据库项

Flutter: Query SQLite Database Items inside a ListView

我创建了一个 class 用于从数据库写入、存储和获取数据。 这是我的数据库助手代码:

DatenbankClient.dart

import 'dart:async';
import 'dart:io';
import 'package:flutter_app/datenbank/Besitzen.dart';
import 'package:flutter_app/datenbank/Kategorie.dart';
import 'package:flutter_app/datenbank/Rezepte.dart';
import 'package:flutter_app/datenbank/Zutat.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';

class DatenbankClient{
  Database _db;

  Future create() async{
    Directory path = await getApplicationDocumentsDirectory();
    String dbPath = join(path.path, "datenbank.db");

    _db = await openDatabase(dbPath, version: 1,
      onCreate: this._create);
  }


  //Erstellt die Tabellen
  Future _create(Database db, int version) async{

    await db.execute("""
        CREATE TABLE kategorie (
           id INTEGER PRIMARY KEY,
           titel TEXT NOT NULL)                    
    """);

    await db.execute("""
        CREATE TABLE rezepte (
           id INTEGER PRIMARY KEY,
           kategorie_ID INTEGER NOT NULL,
           name TEXT NOT NULL,
           beschreibung TEXT DEFAULT NULL,
           favorit INTEGER DEFAULT 0,
           anzahl_pers INTEGER NOT NULL,
           termin TEXT DEFAULT NULL,
           FOREIGN KEY(kategorie_ID) REFERENCES kategorie(id)
            ON UPDATE CASCADE
            ON DELETE CASCADE
    """);


    await db.execute("""
        CREATE TABLE zutaten (
           id INTEGER PRIMARY KEY,
           anzahl INTEGER NOT NULL,
           name TEXT NOT NULL,
           einheit TEXT NOT NULL,
           rezept_ID INTEGER NOT NULL,
            ON UPDATE CASCADE
            ON DELETE CASCADE)          
    """);


    await db.execute("""
        CREATE TABLE besitzen (
           id INTEGER PRIMARY KEY,
           rezept_ID INTEGER NOT NULL,
           zutat_ID INTEGER NOT NULL,
           FOREIGN KEY(rezept_ID) REFERENCES rezepte(id)
            ON UPDATE CASCADE
            ON DELETE CASCADE,
           FOREIGN KEY(zutat_ID) REFERENCES zutaten(id)
            ON UPDATE CASCADE
            ON DELETE CASCADE)
    """);
  }


  //Neue Einträge hinzufügen
  Future upsertKategorie(Kategorie kategorie) async{
    var count = Sqflite.firstIntValue(await _db.rawQuery("SELECT COUNT (*) FROM kategorie WHERE titel = ?", [kategorie.titel]));
    if(count == 0){
      kategorie.id = await _db.insert("kategorie", kategorie.toMap());
    } else{
      await _db.update("kategorie", kategorie.toMap(), where: "id = ?", whereArgs: [kategorie.id]);
    }

    return kategorie;
  }

  Future upsertRezept(Rezepte rezept) async{
    var count = Sqflite.firstIntValue(await _db.rawQuery("SELECT COUNT (*) FROM rezepte WHERE name = ?", [rezept.name]));
    if(count == 0){
      rezept.id = await _db.insert("rezept", rezept.toMap());
    } else{
      await _db.update("rezept", rezept.toMap(), where: "id = ?", whereArgs: [rezept.id]);
    }

    return rezept;
  }

  Future upsertZutat(Zutat zutat) async{
    var count = Sqflite.firstIntValue(await _db.rawQuery("SELECT COUNT (*) FROM zutaten WHERE rezept_ID = ?", [zutat.rezept_ID]));
    if(count == 0){
      zutat.id = await _db.insert("rezept", zutat.toMap());
    } else{
      await _db.update("zutat", zutat.toMap(), where: "id = ?", whereArgs: [zutat.id]);
    }

    return zutat;
  }

  Future upsertBesitzt(Besitzen besitzt) async{
    var count = Sqflite.firstIntValue(await _db.rawQuery("SELECT COUNT (*) FROM besitzen WHERE id = ?", [besitzt.id]));
    if(count == 0){
      besitzt.id = await _db.insert("rezept", besitzt.toMap());
    } else{
      await _db.update("zutat", besitzt.toMap(), where: "id = ?", whereArgs: [besitzt.id]);
    }

    return besitzt;
  }


  //Einträge herausholen
  Future fetchKategorie(int id) async{
    List ergebnis = await _db.query("Kategorie", columns: Kategorie.columns, where: "id=?", whereArgs: [id]);
    Kategorie kategorie = Kategorie.fromMap(ergebnis[0]);

    return kategorie;
  }

  Future fetchRezepte(int id) async{
    List ergebnis = await _db.query("Rezept", columns: Rezepte.columns, where: "id=?", whereArgs: [id]);
    Rezepte rezept = Rezepte.fromMap(ergebnis[0]);

    return rezept;
  }

  Future fetchZutaten(int id) async{
    List ergebnis = await _db.query("Zutat", columns: Zutat.columns, where: "id=?", whereArgs: [id]);
    Zutat zutat = Zutat.fromMap(ergebnis[0]);

    return zutat;
  }

  Future fetchBesitzen(int id) async{
    List ergebnis = await _db.query("Besitzt", columns: Besitzen.columns, where: "id=?", whereArgs: [id]);
    Besitzen besitzen = Besitzen.fromMap(ergebnis[0]);

    return besitzen;
  }

  Future fetchRezeptZutat(int zutatID) async{
    List ergebnis = await _db.query("zutat", columns: Zutat.columns, where: "id = ?", whereArgs: [zutatID]);
    Zutat zutat = Zutat.fromMap(ergebnis[0]);
    zutat.rezept_ID = await fetchRezepte(zutat.rezept_ID);

    return zutat;
  }
}

通过这个飞镖-Class我正在保存用户插入的食谱,然后获取食谱的名称是:

rezepte = await datenbankClient.fetchRezepte(rezepte.id);

但我不知道如何在 ListView 中显示它们。有没有人知道我如何能够在 flutter 中做到这一点?

如果你有几个元素我会说 ListBuilder 是你最好的选择。

new ListView.builder(
  itemCount: rezepte.length,
  itemBuilder: (BuildContext context, int index) {
    final String item = _rezepte[index];
    return new ListTile(
      title: new Text(item["title"])
    );
  },
),