【问题标题】:I'm unable to insert data into my SQLiteDatabase我无法将数据插入我的 SQLiteDatabase
【发布时间】:2020-02-07 02:43:33
【问题描述】:

我正在 Android Studio 中创建一个 SQLiteDatabase,用于加载和计算食物卡路里,在我按下提交后出现以下错误(应用程序随后崩溃):

2020-02-06 21:36:47.840 26379-26379/? E/SQLiteLog: (1) 表 food_tbl 没有名为卡路里的列 2020-02-06 21:36:47.840 26379-26379/? E/SQLiteDatabase: 插入错误名称=啤酒卡路里=567 记录日期=1581043007840 android.database.sqlite.SQLiteException: table food_tbl has no column namedcalories (code 1): ,同时编译:INSERT INTO food_tbl(name,calories,recorddate) VALUES (?,?,?)

****这是我的 DatabaseHandler 代码:****

公共类 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;
}

}

【问题讨论】:

  • onUpgrade 可能不会被调用。
  • 使用房间,很方便也很干净
  • 您可能有此代码的先前版本,但列名不同,但没有更改数据库版本。

标签: android sqlite


【解决方案1】:

试试这个

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"+ ")";  

【讨论】:

  • 不,那没用。我认为那是肯定的。
【解决方案2】:

根据崩溃日志,我可以理解您需要在表 food_tbl 中添加列 calories

请添加calories 列以解决此问题。

【讨论】:

    【解决方案3】:

    我认为你的创建表查询是错误的,所以试试下面的代码。

    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);"
    

    【讨论】:

    • 那也没做
    【解决方案4】:

    问题出在您的totalCalories() 中的cursor.getInt(0) 您没有从数据库中检索任何内容,因为您在第一个索引中有一个整数列,但您从第 0 个索引中检索它。
    解决方案:

    cursor.getInt(1)
    

    【讨论】:

      【解决方案5】:

      我解决了这个问题:我使用的 android studio 中的模拟器存在兼容性问题。我使用的是 Nexus 5 API 24,显然这与 sqlite3 不兼容。我为我的模拟器切换到 Pixel 3 API 26 并且它工作正常。感谢您的所有回复。它有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 2017-11-08
        • 2012-08-05
        • 2019-01-07
        • 2017-03-17
        • 1970-01-01
        相关资源
        最近更新 更多