Je crée une base de données SQLite dans Android Studio qui charge et calcule les calories des aliments et j'obtiens l'erreur ci-dessous après avoir appuyé sur Soumettre (l'application plante alors):
2020- 02-06 21: 36: 47.840 26379-26379 /? E / SQLiteLog: (1) la table food_tbl n'a pas de colonne nommée calories 2020-02-06 21: 36: 47.840 26379-26379 /? E / SQLiteDatabase: Erreur lors de l'insertion du nom = calories de la bière = 567 recorddate = 1581043007840 android.database.sqlite.SQLiteException: la table food_tbl n'a pas de colonne nommée calories (code 1):, lors de la compilation: INSERT INTO food_tbl (nom, calories, date d'enregistrement) VALUES (?,?,?)
* *** Voici mon code DatabaseHandler: ****
La classe publique DatabaseHandler étend 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 Réponses :
Essayez ceci
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"+ ")";
Non, cela n'a pas fonctionné. Je pensais que ce serait sûr.
D'après le journal des plantages, je peux comprendre que vous devez ajouter la colonne calories dans votre tableau food_tbl .
veuillez ajouter la colonne calories pour résoudre le problème.
Je pense que votre requête de création de table est erronée, alors essayez le code ci-dessous.
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);"
Cela ne l'a pas fait non plus
Le problème est dans votre totalCalories () dans le cursor.getInt (0)
Vous ne récupérez rien de la base de données, puisque vous avez une colonne entière dans le 1er index mais que vous la récupérez à partir du 0ème index.
Solution:
cursor.getInt(1)
J'ai résolu le problème: il y avait un problème de compatibilité avec l'émulateur dans le studio Android que j'utilisais. J'utilisais Nexus 5 API 24 et apparemment, ce n'est pas compatible avec sqlite3. Je suis passé à l'API 26 de Pixel 3 pour mon émulateur et cela a fonctionné. Merci pour toutes vos réponses. Cela a aidé.
onUpgrade n'est peut-être pas appelé.
utiliser la chambre, c'est très facile et propre