0

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:Really ugly table schema with one example 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!

7
  • 1
    You need to parse the values to the model class. For that you need to create Recipe.fromMap() method. Also you need to parse the values to the json when you storing data. ( toMap() method). Please refer these articles (medium.com/flutter-community/… and itnext.io/how-to-use-flutter-with-sqlite-b6c75a5215c4) Commented Jun 23, 2020 at 8:00
  • I think the question sounds stupid but what can I now do with those methods? Commented Jun 23, 2020 at 8:54
  • Those methods convert your model class to the json and vice versa. Commented Jun 23, 2020 at 9:48
  • Yes thats what I understood, so than I have to fetch the data from the json? Commented Jun 23, 2020 at 9:52
  • 1
    Hmm... Okay I'll try Commented Jun 23, 2020 at 11:08

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.