Reputation: 470
I have a project where I have to display in a listview some recipes. Those recipes I want to fetch from a sqlite database.I tried some different ways and I am able to get the Data but dont know how to get it into the model. Everything is working fine, when I hardcode all the recipes into my model(recipe.dart):
import './ingredient.dart';
/// Represents a Recipe.
class Recipe {
final int id;
final String name;
final String imagePath;
final String preperation;
final List<Ingredient> ingredients;
Recipe(
this.id, this.name, this.preperation, this.imagePath, this.ingredients);
static List<Recipe> fetchAll() {
int id = 0;
String title = "Spaghettti";
return [
Recipe(
id,
title,
"Das Hackfleisch für die Burger vorbereiten. Mit Salz und Pfeffer würzen und in die Form von Burgerpatties bringen. Von beiden Seiten scharf anbraten. Kurz vor Ende den Käse auf die Hackfleischteile legen und schmelzen lassen. Den Speck kross braten und die Hälfte der Zwiebelscheiben leicht glasig dünsten. Die Eier als Spiegeleier auf einer Seite braten. Das Eigelb muss noch flüssig sein. In der Zwischenzeit die Burgerbrötchen halbieren und im Ofen bei ca. 180 °C ungefähr 5 Minuten vorwärmen. Wenn alles fertig ist, den Burger in der folgenden Reihenfolge belegen: Auf der Brötchenunterseite Ketchup, Mayonnaise und Senf verteilen. Das Salatblatt Tomaten, rohe Zwiebelringe, Hackfleisch mit dem Käse, Speckscheiben, Spiegelei, angedünstete Zwiebeln, Ananas und die Rote Beete auftürmen und mit dem Brötchenoberteil abschließen. Alles mit einem Holzsticker fixieren und servieren",
'assets/images/spaghetti2.jpg', [
Ingredient('Tomaten Soße', '50 ml '),
Ingredient('Nudeln', '200 g '),
]),
Recipe(
1,
'Pizza',
"Das Hackfleisch für die Burger vorbereiten. Mit Salz und Pfeffer würzen und in die Form von Burgerpatties bringen. Von beiden Seiten scharf anbraten. Kurz vor Ende den Käse auf die Hackfleischteile legen und schmelzen lassen. Den Speck kross braten und die Hälfte der Zwiebelscheiben leicht glasig dünsten. Die Eier als Spiegeleier auf einer Seite braten. Das Eigelb muss noch flüssig sein. In der Zwischenzeit die Burgerbrötchen halbieren und im Ofen bei ca. 180 °C ungefähr 5 Minuten vorwärmen. Wenn alles fertig ist, den Burger in der folgenden Reihenfolge belegen: Auf der Brötchenunterseite Ketchup, Mayonnaise und Senf verteilen. Das Salatblatt Tomaten, rohe Zwiebelringe, Hackfleisch mit dem Käse, Speckscheiben, Spiegelei, angedünstete Zwiebeln, Ananas und die Rote Beete auftürmen und mit dem Brötchenoberteil abschließen. Alles mit einem Holzsticker fixieren und servieren",
'assets/images/Pizza.jpg', [
Ingredient('Teig', '500 g '),
Ingredient('Nudeln', '200 g '),
]),
Recipe(
2,
'Burger',
"Das Hackfleisch für die Burger vorbereiten. Mit Salz und Pfeffer würzen und in die Form von Burgerpatties bringen. Von beiden Seiten scharf anbraten. Kurz vor Ende den Käse auf die Hackfleischteile legen und schmelzen lassen. Den Speck kross braten und die Hälfte der Zwiebelscheiben leicht glasig dünsten. Die Eier als Spiegeleier auf einer Seite braten. Das Eigelb muss noch flüssig sein. In der Zwischenzeit die Burgerbrötchen halbieren und im Ofen bei ca. 180 °C ungefähr 5 Minuten vorwärmen. Wenn alles fertig ist, den Burger in der folgenden Reihenfolge belegen: Auf der Brötchenunterseite Ketchup, Mayonnaise und Senf verteilen. Das Salatblatt Tomaten, rohe Zwiebelringe, Hackfleisch mit dem Käse, Speckscheiben, Spiegelei, angedünstete Zwiebeln, Ananas und die Rote Beete auftürmen und mit dem Brötchenoberteil abschließen. Alles mit einem Holzsticker fixieren und servieren",
'assets/images/burger.jpg', [
Ingredient('Burger Brötchen', '2'),
Ingredient('Salat', '50 g '),
]),
];
}
static Recipe fetchByID(int recipeID) {
List<Recipe> recipes = Recipe.fetchAll();
for (var i = 0; i < recipes.length; i++) {
if (recipes[i].id == recipeID) {
return recipes[i];
}
}
return null;
}
}
As you can see it contains an id, a name,an image path,a preperation, and a list of ingredients which is also a model(ingredient.dart):
class Ingredient {
final String ingredientTitle;
final String amount;
Ingredient(this.ingredientTitle, this.amount);
}
Because everything still works when I add a or delete a recipe in the fetchAll() function I think its enough to just edit this one. But my database is a bit more complex structured it contains 4 tables:
Thats my really ugly table schema with one example. As you can see every ID without the Zutat_ID references to Rezept_ID of the first table. My question is how can I fetch all recipes of the Database into the model? I hope you can understand the question and help me. Thank you!
Upvotes: 0
Views: 2532
Reputation: 626
I think you're looking for something like this:
Future<List<Recipe>> recipes() async {
// Get a reference to the database.
final Database db = await database;
// Query the table for all The Recipes.
final List<Map<String, dynamic>> maps = await db.query('recipe');
// Convert the List<Map<String, dynamic> into a List<Recipe>.
return List.generate(maps.length, (i) {
return Recipe(
id: maps[i]['id'],
name: maps[i]['name'],
// Same for the other properties
);
});
}
I hope this helps.
Upvotes: 2