Я не могу вставить данные в мою базу данных SQLiteDatabase - PullRequest
0 голосов
/ 07 февраля 2020

Я создаю базу данных SQLite в Android Studio, которая загружает и рассчитывает калории в продуктах питания, и я получаю сообщение об ошибке ниже после нажатия кнопки Отправить (приложение затем падает):

2020-02-06 21: 36: 47,840 26379-26379 /? E / SQLiteLog: (1) в таблице food_tbl нет столбца с именем calories 2020-02-06 21: 36: 47.840 26379-26379 /? E / SQLiteDatabase: Ошибка при вставке имени = калорий на пиво = 567 recorddate = 1581043007840 android .database.sqlite.SQLiteException: в таблице food_tbl нет столбца с именем calories (код 1): при компиляции: INSERT INTO food_tbl (name, calories, recorddate) ) ЗНАЧЕНИЯ (?,?,?)

**** Вот мой код DatabaseHandler: ****

publi c Класс DatabaseHandler расширяет SQLiteOpenHelper {

private final ArrayList<Food> foodList = new ArrayList<>();


public DatabaseHandler(Context context) {
    super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
    // create table
    String CREATE_TABLE = "CREATE TABLE " + Constants.TABLE_NAME + "("
            + Constants.KEY_ID + " INTEGER PRIMARY KEY, " + Constants.FOOD_NAME +
            " TEXT, " + Constants.FOOD_CALORIES_NAME + " INT, " + Constants.DATE_NAME + " LONG);";

    db.execSQL(CREATE_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(" DROP TABLE IF EXISTS " + Constants.TABLE_NAME);


    // create a new one
    onCreate(db);

}

// Get total items saved
public int getTotalItems() {
    int totalItems = 0;

    String query = " SELECT * FROM " + Constants.TABLE_NAME;
    SQLiteDatabase dba = this.getReadableDatabase();
    Cursor cursor = dba.rawQuery(query, null);

    totalItems = cursor.getCount();

    cursor.close();

    return totalItems;
}

//get total calories consumed
public int totalCalories(){
    int cals = 0;

    SQLiteDatabase dba = this.getReadableDatabase();

    String query = "SELECT SUM( " + Constants.FOOD_CALORIES_NAME + " ) " +
            "FROM " + Constants.TABLE_NAME;

    Cursor cursor = dba.rawQuery(query, null);

    if (cursor.moveToFirst()){
        cals = cursor.getInt(0);
    }

    cursor.close();
    dba.close();


    return cals;
}

//delete food item
public void deleteFood(int id) {

    SQLiteDatabase dba = this.getWritableDatabase();
    dba.delete(Constants.TABLE_NAME, Constants.KEY_ID + " = ?",
            new String[]{ String.valueOf(id)});

    dba.close();
}

//add content to db - add food
public void addFood(Food food) {

    SQLiteDatabase dba = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(Constants.FOOD_NAME, food.getFoodName());
    values.put(Constants.FOOD_CALORIES_NAME, food.getCalories());
    values.put(Constants.DATE_NAME, System.currentTimeMillis());

    dba.insert(Constants.TABLE_NAME, null, values);

    Log.v("Added Food item", "Yesss!!");

    dba.close();
}

// Get all foods
public ArrayList<Food> getFoods() {

    foodList.clear();

    SQLiteDatabase dba = this.getReadableDatabase();

    Cursor cursor = dba.query(Constants.TABLE_NAME,
            new String[]{Constants.KEY_ID, Constants.FOOD_NAME, Constants.FOOD_CALORIES_NAME,
            Constants.DATE_NAME}, null, null, null, null, Constants.DATE_NAME + " DESC ");

    // loop through...
    if (cursor.moveToFirst()) {
        do {

            Food food = new Food();
            food.setFoodName(cursor.getString(cursor.getColumnIndex(Constants.FOOD_NAME)));
            food.setCalories(cursor.getInt(cursor.getColumnIndex(Constants.FOOD_CALORIES_NAME)));
            food.setFoodId(cursor.getInt(cursor.getColumnIndex(Constants.KEY_ID)));

            DateFormat dateFormat = DateFormat.getDateInstance();
            String date = dateFormat.format(new Date(cursor.getLong(cursor.getColumnIndex(Constants.DATE_NAME))).getTime());

            food.setRecordDate(date);

            foodList.add(food);

        }while (cursor.moveToNext());
    }

    cursor.close();
    dba.close();

    return foodList;
}

}

Ответы [ 5 ]

0 голосов
/ 23 февраля 2020

Я решил проблему: была проблема совместимости с эмулятором в android студии, которую я использовал. Я использовал Nexus 5 API 24 и, видимо, это не совместимо с sqlite3. Я переключился на Pixel 3 API 26 для моего эмулятора, и это сработало. Спасибо за все ваши ответы. Это помогло.

0 голосов
/ 07 февраля 2020

Проблема в вашем totalCalories() в cursor.getInt(0). Вы ничего не извлекаете из базы данных, поскольку у вас есть целочисленный столбец в 1-м индексе, но вы извлекаете его из 0-го индекса.
Решение:

cursor.getInt(1)
0 голосов
/ 07 февраля 2020

Что касается журнала cra sh, я понимаю, что вам нужно добавить столбец calories в вашу таблицу food_tbl.

. Пожалуйста, добавьте столбец calories, чтобы исправить проблему.

0 голосов
/ 07 февраля 2020

Я думаю, что ваш запрос создания таблицы неправильный, поэтому попробуйте следующий код.

String CREATE_TABLE = "CREATE TABLE " + Constants.TABLE_NAME + "("
        + Constants.KEY_ID + " INTEGER PRIMARY KEY," + Constants.FOOD_NAME +
        " TEXT," + Constants.FOOD_CALORIES_NAME + " INTEGER," + Constants.DATE_NAME + " DATETIME);"
0 голосов
/ 07 февраля 2020

Попробуйте это

String CREATE_TABLE = "CREATE TABLE " + Constants.TABLE_NAME + "("
            + Constants.KEY_ID + " INTEGER PRIMARY KEY, " + Constants.FOOD_NAME +
            " TEXT, " + Constants.FOOD_CALORIES_NAME + " INT, " + Constants.DATE_NAME + " LONG"+ ")";  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...