Открыть / закрыть базу данных SQL в том же потоке - PullRequest
1 голос
/ 27 марта 2019

Я разрабатываю книгу рецептов и внедряю этот метод для вставки моего рецепта в базу данных.В для цикла я получаю имя и количество ингредиента из кратных значений EditText, сохраняя каждый из них в экземпляре Ingredient.class ( newIngredient ).Затем я вставляю экземпляр в БД и добавляю его в ArrayList.Следующие «если условия» относятся к заголовку, времени и другим атрибутам рецепта.Наконец, я также вставляю экземпляры Recipe и Tag в таблицы соседних БД и закрываю БД.

public void saveRecipe() {

    dbHelper = new DatabaseHelper(context);

    // creating new recipe from user input
    Ingredient newIngredient;
    String title, childIngredient, instruction, tag;
    int target, time, childQuantity, calories;
    int countIngredients = parentIngredientLayout.getChildCount();
    int countTags = chipGroup.getChildCount();
    ArrayList<Ingredient> ingredients = null;
    ArrayList<Tag> tags = null;
    View childViewIng = null;
    EditText childTextViewI = null;
    EditText childTextViewQ = null;

    // ingredients fields settings
    for (int d=0; d<countIngredients; d++) {
        childViewIng = parentIngredientLayout.getChildAt(d);
        childTextViewI = childViewIng.findViewById(R.id.ingredientsField);
        childTextViewQ = childViewIng.findViewById(R.id.quantityField);
        childIngredient = childTextViewI.getText().toString();
        childQuantity = Integer.parseInt(childTextViewQ.getText().toString());
        newIngredient = new Ingredient(childIngredient, childQuantity);
        dbHelper.insertIngredient(newIngredient);
        ingredients.add(newIngredient);
    }

    //recipe fields settings
    if (photoPath1 == null)
        photoPath1 = "";

    if (photoPath2 == null)
        photoPath2 = "";

    if (photoPath3 == null)
        photoPath3 = "";

    if (titleText.getText().toString().isEmpty()) {
        title = "";
    } else {
        title = titleText.getText().toString();
    }

    if (targetNumber.getText().toString().isEmpty()) {
        target = 0;
    } else {
        target = Integer.parseInt(targetNumber.getText().toString());
    }

    if (timeNumber.getText().toString().isEmpty()) {
        time = 0;
    } else {
        time = Integer.parseInt(timeNumber.getText().toString());
    }

    if (instructionText.getText().toString().isEmpty()) {
        instruction = "";
    } else {
        instruction = instructionText.getText().toString();
    }

    if (caloriesNumber.getText().toString().isEmpty()) {
        calories = 0;
    } else {
        calories = Integer.parseInt(caloriesNumber.getText().toString());
    }

    if (tagName.getText().toString().isEmpty()) {
        tag = "";
    } else {
        tag = tagName.getText().toString();
    }

    Recipe newRecipe = new Recipe(title, photoPath1, photoPath2, photoPath3, instruction, target, time, calories, ingredients);
    Tag newTag = new Tag(tag);

    dbHelper.insertRecipe(newRecipe);
    dbHelper.insertTag(newTag);

    dbHelper.close(); }

Я обнаружил при отладке, что в этом случае вставляется только первый ингредиент.Я пытался переместить FOR до конца кода, но в этом случае вставляются и рецепт, и тег, и всегда только первый ингредиент.Я думаю, что проблема связана с открытием / закрытием БД.Кто-нибудь может мне помочь?Конструктор ингредиентов:

public Ingredient(String ingredient_name, int quantity) {

    this.ingredient_name = ingredient_name;
    this.quantity = quantity;
}

Метод dbHelper.insertIngredient (newIngredient):

public boolean insertIngredient(Ingredient ingredient) {

    db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(INGREDIENT_NAME, ingredient.getIngredient_name());
    contentValues.put(QUANTITY, ingredient.getQuantity());
    contentValues.put(KEY_CREATED_AT, time.getTime().toString());

    long result = db.insert(TBL_INGREDIENTS, null, contentValues);
    //db.close();
    Log.e(TAG, "Ingredient inserted!");

    if (result == -1) {
        return false;
    } else {
        return true;
    }

}

1 Ответ

1 голос
/ 28 марта 2019

Хорошо, благодаря вашему комментарию у нас возникла проблема:)

Вы звоните .add(newIngredient) в список, который вы инициализировали с помощью ArrayList<Ingredient> ingredients = null;

Измените его на

ArrayList<Ingredient> ingredients = new ArrayList<Ingredient>();

и все заработает :)

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...