Проблема с обработкой набора результатов sqflite - PullRequest
0 голосов
/ 27 марта 2020

Я работаю над приложением флаттера, которое будет использовать sqflite в качестве бэкэнда. Я борюсь с картой ответов, которую я получаю обратно. Я следовал многим примерам, демонстрирующим определение таблиц, создание класса, моделирующего каждую из таблиц, и добавление функций «fromMap» и «toMap» к каждой.

Проблема c, с которой я сталкиваюсь, заключается в том, что когда я запрашиваю свою таблицу (выбирая все строки), я могу подтвердить, что количество строк, возвращаемых из запроса, является правильным (например, 3 строки). Тем не менее, когда я вызываю forEach для набора результатов, он вызывает мой метод fromMap 12 раз .... это число столбцов в моей таблице. Когда я записываю длину набора результатов (results.length), он отображает 12 .... а не 3. У меня есть 3 строки в таблице, поэтому я ожидаю, что при выводе результатов results.length.toString () будет показано 3 .. ..не 12.

Я новичок во Флаттере / Дартс, поэтому я уверен, что совершаю новую ошибку ie, но я не могу понять, где моя проблема.

Вот пример структуры таблицы, которую я использую:

await db
        .execute('''
          CREATE TABLE $tblRecipes ($recipeId INTEGER PRIMARY KEY AUTOINCREMENT,
          $recipeRecipeName TEXT,
          $recipeImageUrl TEXT,
          $recipeServings INTEGER, 
          $recipeServingSize TEXT,
          $recipeSource TEXT, 
          $recipePrepTime TEXT,
          $recipeCookTime TEXT,
          $recipeFavorite INTEGER, 
          $recipeDifficulty INTEGER,
          $recipeSummary TEXT, 
          $recipeDateCreated TEXT)
          ''');

Вот функция, где я запрашиваю таблицу:

/*
 Function:  Return all recipes
 */
static Future<List<Recipe>> selectAll() async {

    _db = _instance.getDatabase();
    if (_db == null) {
      _db = _instance.getDatabase();
    } 

    // Query the table for all The Recipes.
    //final List<Map> results = await _db.query('recipes');
    List<Map> results = await _db.rawQuery('SELECT * FROM recipes');

    // Populate a list with all of the recipes
    var recipeList = new List<Recipe>();
    results.forEach((result) {
      Recipe recipe = Recipe.fromMap(result);
      print(result);
      recipeList.add(recipe);
    });


    logger.d("RecipeCrud:selectAll - Returning " + recipeList.length.toString() + "recipes");
    return recipeList;

  }

Вот мой fromMap function:

  factory Recipe.fromMap(Map<String, dynamic> data) {
    Recipe recipe = Recipe(
      id: data['id'],
      recipeName: data['recipe_name'],
      imageUrl: data['image_url'],
      servings: data['servings'],
      servingSize: data['serving_size'],
      source: data['source'],
      prepTime: data['prep_time'],
      cookTime: data['cook_time'],
      favorite: data['favorite'],
      difficulty: data['difficulty'],
      summary: data['summary'],
      dateCreated: data['date_created']);
  logger.d("Recipe:fromMap - recipe id:  " + recipe.id.toString() + " Recipe Name:  " + recipe.recipeName);
  return  recipe;
  }

Наконец, я также включаю подмножество моего вывода журнала, показывающего вывод журнала, который у меня есть в фрагментах кода выше. Вы увидите, что я загружаю 3 рецепта, и хотя у меня должно быть только 3 рецепта, мой метод fromMap вызывался более 3 раз .... и первый рецепт повторяется при четвертом вызове fromMap.

flutter:┌─────────────────────────────────────────────────
flutter: │ DataBaseHelper:_loadData - Recipes loaded with:  3 rows.
flutter: └─────────────────────────────────────────────────
....

flutter: Recipe:selectAll results:  length:  12  
....

flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  1 Recipe Name:  Bolognese
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 1, recipe_name: Bolognese, image_url: AuthenticBologneseScaled.png, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 3 hours, favorite: 1, difficulty: 2, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  2 Recipe Name:  Clam Chowder
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 2, recipe_name: Clam Chowder, image_url: ClamChowderScaled.jpg, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 20 minutes, cook_time: 1 hour, favorite: 1, difficulty: 4, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  3 Recipe Name:  Favorite Quinoa Salad
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 3, recipe_name: Favorite Quinoa Salad, image_url: FavoriteQuinoaSaladScaled.png, servings: 2, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 0 minutes, favorite: 1, difficulty: 1, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  4 Recipe Name:  Bolognese
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 4, recipe_name: Bolognese, image_url: AuthenticBologneseScaled.png, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 3 hours, favorite: 1, difficulty: 2, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  5 Recipe Name:  Clam Chowder
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 5, recipe_name: Clam Chowder, image_url: ClamChowderScaled.jpg, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 20 minutes, cook_time: 1 hour, favorite: 1, difficulty: 4, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  6 Recipe Name:  Favorite Quinoa Salad
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 6, recipe_name: Favorite Quinoa Salad, image_url: FavoriteQuinoaSaladScaled.png, servings: 2, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 0 minutes, favorite: 1, difficulty: 1, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  7 Recipe Name:  Bolognese
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 7, recipe_name: Bolognese, image_url: AuthenticBologneseScaled.png, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 3 hours, favorite: 1, difficulty: 2, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  8 Recipe Name:  Clam Chowder
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 8, recipe_name: Clam Chowder, image_url: ClamChowderScaled.jpg, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 20 minutes, cook_time: 1 hour, favorite: 1, difficulty: 4, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  9 Recipe Name:  Favorite Quinoa Salad
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 9, recipe_name: Favorite Quinoa Salad, image_url: FavoriteQuinoaSaladScaled.png, servings: 2, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 0 minutes, favorite: 1, difficulty: 1, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  10 Recipe Name:  Bolognese
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 10, recipe_name: Bolognese, image_url: AuthenticBologneseScaled.png, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 3 hours, favorite: 1, difficulty: 2, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  11 Recipe Name:  Clam Chowder
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 11, recipe_name: Clam Chowder, image_url: ClamChowderScaled.jpg, servings: 6, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 20 minutes, cook_time: 1 hour, favorite: 1, difficulty: 4, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ Recipe:fromMap - recipe id:  12 Recipe Name:  Favorite Quinoa Salad
flutter: └─────────────────────────────────────────────────
flutter: Recipe:selectAll - forEach (Single Result Row):  {id: 12, recipe_name: Favorite Quinoa Salad, image_url: FavoriteQuinoaSaladScaled.png, servings: 2, serving_size: 1 cup, source: https://mimiskitchen.net, prep_time: 10 minutes, cook_time: 0 minutes, favorite: 1, difficulty: 1, summary: null, date_created: 3/18/20}
flutter: ┌─────────────────────────────────────────────────
flutter: │ RecipeCrud:selectAll - Returning 12recipes
flutter: └─────────────────────────────────────────────────

Буду признателен за любую помощь, которую вы можете предложить.

...