Студия Android SQLite не может добавить более одной строки в таблицу базы данных - PullRequest
0 голосов
/ 30 ноября 2018

Я создаю приложение, которое генерирует случайный рецепт на основе определенных фильтров, с функциями добавления и удаления рецептов.Прямо сейчас я работаю над добавлением рецепта (который будет введен как URL), который делается путем вставки данных, собранных из двух полей EditText, в базу данных.Заполняя текстовые поля и нажимая кнопку отправки, я получаю сообщение об ошибке «Ошибка. Пожалуйста, введите некоторые данные», которое я настроил.Что-то в db.insertData(String recipe, String category) работает неправильно.Он работал нормально, когда я отформатировал код, чтобы он был db.insertData(String recipe), но по какой-то причине он не работает с несколькими аргументами.

MainActivity.java

package com.example.randomrecipeapp;
import com.example.randomrecipeapp.helper.DatabaseHelper;
import com.example.randomrecipeapp.model.Category;
import com.example.randomrecipeapp.model.Recipe;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.List;


public class MainActivity extends AppCompatActivity {

//Fields
EditText add_link;
EditText add_category;
Button insert_recipe;

DatabaseHelper db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    db = new DatabaseHelper(getApplicationContext());

    //Connect fields
    add_link = findViewById(R.id.add_link);
    add_category = findViewById(R.id.add_category);
    insert_recipe = findViewById(R.id.insert_recipe);

    insert_recipe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String link = add_link.getText().toString();
            String category = add_category.getText().toString();

            if (!link.equals("") && !category.equals("") && db.insertData(link,category)) {
                Toast.makeText(MainActivity.this, "Link and category added to database", Toast.LENGTH_SHORT).show();
                add_link.setText("");
                add_category.setText("");
            } else {
                Toast.makeText(MainActivity.this, "Error. Please enter some data", Toast.LENGTH_SHORT).show();
            }


        }
    });
}
}

DatabaseHelper.java

package com.example.randomrecipeapp.helper;

import com.example.randomrecipeapp.model.Category;
import com.example.randomrecipeapp.model.Recipe;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class DatabaseHelper extends SQLiteOpenHelper {

// Logcat tag
private static final String LOG = "DatabaseHelper";

//database name
private static final String DATABASE_NAME = "recipes.db";

//table names
private static final String TABLE_RECIPES = "recipes";


//common column name
private static final String KEY_ID = "id";

//RECIPES table - column names
private static final String KEY_RECIPES = "recipes";
private static final String KEY_CATEGORIES = "categories";

//CREATE TABLE statements

//create RECIPES table
private static final String CREATE_TABLE_RECIPES =
        "CREATE TABLE " + TABLE_RECIPES + "(" + KEY_ID + " INTEGER     PRIMARY KEY," + KEY_RECIPES + " TEXT" + KEY_CATEGORIES + "TEXT" + ")";

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);

}

@Override
public void onCreate(SQLiteDatabase db) {

    // creating required tables
    db.execSQL(CREATE_TABLE_RECIPES);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int  newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECIPES);
    // create new tables
    onCreate(db);

}

//insert data

public boolean insertData(String link, String category) {

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_RECIPES, link);
    contentValues.put(KEY_CATEGORIES, category);
    long result = db.insert(TABLE_RECIPES, null, contentValues);
    return result != -1;
}

}

ActivityMain.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/add_link"
        android:layout_weight="1"
        android:hint="Recipe Link"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/add_category"
        android:layout_weight="1"
        android:hint="Recipe Category"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/insert_recipe"
        android:text="add"/>

</LinearLayout>

</android.support.constraint.ConstraintLayout>

1 Ответ

0 голосов
/ 30 ноября 2018

Ваша проблема заключается в том, что из-за нескольких ошибок в SQL-таблице создания таблиц столбец с именами категорий не существует, и поэтому вставка не может возвращать -1.

У вас есть: -

private static final String CREATE_TABLE_RECIPES =
    "CREATE TABLE " + TABLE_RECIPES + "(" + KEY_ID + " INTEGER     PRIMARY KEY," + KEY_RECIPES + " TEXT" + KEY_CATEGORIES + "TEXT" + ")";

Это должно быть: -

private static final String CREATE_TABLE_RECIPES =
        "CREATE TABLE " + TABLE_RECIPES + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_RECIPES + " TEXT," + KEY_CATEGORIES + " TEXT" + ")";

т.е.

  1. Запятая, которая должна отделять столбец рецептов и столбец категорий, опущена.
  2. Необходимыечтобы быть пробелом между категориями и ТЕКСТОМ

После внесения изменений в код вам необходимо выполнить одно из следующих действий: -

  • удалить данные приложения или,
  • удалите приложение или
  • увеличьте номер версии базы данных с 1, т.е. измените super(context, DATABASE_NAME, null, 1); на super(context, DATABASE_NAME, null, 2); // <<<<<<<<<< Изменили 1 на 2</li>

После выполнения одного из вышеперечисленных действий вы должны перезапустить приложение.

...