【问题标题】:Flutter: Query SQLite Database Items inside a ListViewFlutter:在 ListView 中查询 SQLite 数据库项
【发布时间】:2018-09-03 08:21:47
【问题描述】:

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

DatanbankClient.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;
  }
}

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

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

但我不知道如何在 ListView 中显示它们。有谁知道我怎么能在颤动中做到这一点?

【问题讨论】:

    标签: sqlite listview flutter


    【解决方案1】:

    如果你有几个元素我会说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"])
        );
      },
    ),
    

    【讨论】:

    • 我已经尝试了您的解决方案,但它在 itemCount 处向我抛出了一个错误:“没有为 Rezepte 类定义 getter 'length'”。而且我不知道我应该从哪里得到变量“_rezepte”。对我的误解很抱歉
    • 听起来数据还没有被提取到 rezepte 对象。在构建列表之前,您需要实现某种方法来检查对象是否包含数据。
    • 如果你正在寻找一个好的异步插件来帮助你处理这个问题,那么我推荐async loader
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多