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"])
);
},
),
我创建了一个 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"])
);
},
),