База данных SQLite для RecipeApp (отношения один ко многим) - PullRequest
1 голос
/ 04 апреля 2019

В своем приложении я создал класс Recipe, класс Ingredient и класс ListIngredient;затем в своем DBHelper я создал таблицу рецептов, таблицу ингредиентов и таблицу ListIngredient, чтобы связать один рецепт с несколькими ингредиентами следующим образом:

String RecipeTable = "CREATE TABLE " + TBL_RECIPE + " ( " +
            RECIPE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            RECIPE_TITLE + " TEXT, " +
            RECIPE_FIRST_PHOTO + " TEXT, " +
            RECIPE_SECOND_PHOTO + " TEXT, " +
            RECIPE_THIRD_PHOTO + " TEXT, " +
            RECIPE_TARGET + " INTEGER, " +
            RECIPE_TIME + " INTEGER, " +
            RECIPE_INSTRUCTIONS + " TEXT, " +
            RECIPE_CALORIES + " INTEGER, " +
            KEY_CREATED_AT + " DATETIME" + ")";
    db.execSQL(RecipeTable);


String IngredientTable = "CREATE TABLE " + TBL_INGREDIENTS + " ( " +
            INGREDIENT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            INGREDIENT_NAME + " TEXT, " +
            QUANTITY + " INTEGER, " +
            KEY_CREATED_AT + " DATETIME" + ")";
    db.execSQL(IngredientTable);

String ListIngredients = "CREATE TABLE " + TBL_LIST_INGREDIENTS + " ( " +
            INGREDIENT_ID + " INTEGER, " +
            INGREDIENT_NAME + " TEXT, " +
            RECIPE_ID + " INTEGER," +
            " FOREIGN KEY ("+RECIPE_ID+") REFERENCES "+TBL_RECIPE+"("+RECIPE_ID+"));";
    db.execSQL(ListIngredients);

Затем я вставляю новый рецепт и новый ингредиентс помощью этих методов:

public boolean insertRecipe(Recipe recipe) {
    db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(RECIPE_TITLE, recipe.getTitle());
    contentValues.put(RECIPE_FIRST_PHOTO, recipe.getFirstImage());
    contentValues.put(RECIPE_SECOND_PHOTO, recipe.getSecondImage());
    contentValues.put(RECIPE_THIRD_PHOTO, recipe.getThirdImage());
    contentValues.put(RECIPE_TARGET, recipe.getTargetPeople());
    contentValues.put(RECIPE_TIME, recipe.getTime());
    contentValues.put(RECIPE_INSTRUCTIONS, recipe.getInstructions());
    contentValues.put(RECIPE_CALORIES, recipe.getCalories());
    contentValues.put(KEY_CREATED_AT, time.getTime().toString());

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

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

}

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;
    }

}

Но как я могу вставить в таблицу ListIngredient элементы?

1 Ответ

3 голосов
/ 04 апреля 2019

Просто сделайте то же самое, что вы уже сделали для другой таблицы, с другими именами столбцов:

public boolean insertListIngredient(ListIngredient listIngredient) {

    db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(INGREDIENT_ID, listIngredient.getIngredientId());
    contentValues.put(INGREDIENT_NAME, listIngredient.getIngredientName());
    contentValues.put(RECIPE_ID, listIngredient.getReceipeId());

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

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

}

Obv, так как у меня нет ваших классов, я написал геттеры случайным образом, просто замените их правильными значениями, и все готово

Edit:

Ваш метод db.insert(...) возвращает идентификатор вставленной строки, ссылки . так что вы можете просто вернуть его и передать следующему методу, я напишу здесь пример для таблицы Receipe:

Из справочника:

Возвращает

длинный идентификатор новой вставленной строки или -1, если произошла ошибка

Вставка и возврат:

public long insertRecipe(Recipe recipe) {
    db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(RECIPE_TITLE, recipe.getTitle());
    contentValues.put(RECIPE_FIRST_PHOTO, recipe.getFirstImage());
    contentValues.put(RECIPE_SECOND_PHOTO, recipe.getSecondImage());
    contentValues.put(RECIPE_THIRD_PHOTO, recipe.getThirdImage());
    contentValues.put(RECIPE_TARGET, recipe.getTargetPeople());
    contentValues.put(RECIPE_TIME, recipe.getTime());
    contentValues.put(RECIPE_INSTRUCTIONS, recipe.getInstructions());
    contentValues.put(RECIPE_CALORIES, recipe.getCalories());
    contentValues.put(KEY_CREATED_AT, time.getTime().toString());

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

    return result;

}

Вызов метода (пример):

Receipe mReceipe;
ListIngredient mListIngredient;

// all code
long receipeId = dbHelper.insertRecipe(mReceipe);
if(receipeId != -1){
    mListIngredient.setReceipeId(receipeId);
    dbHelper.insertListIngredient(mListIngredient);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...