我正在 Android Studio 中开发移动应用程序。我有一个用于 SQLite 数据库的“BreakfastDatabaseHelper”类。最初,我在那里创建了“早餐”和“calories_summary”表和方法。
package com.example.calorieapp.ui.dashboard;
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.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
public class BreakfastDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "breakfast_database";
private static final int DATABASE_VERSION = 2;
static final String TABLE_BREAKFAST = "breakfast";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_PRODUCT_NAME = "product_name";
public static final String COLUMN_GRAMS = "grams";
public static final String COLUMN_CALORIES = "calories";
public static final String COLUMN_PROTEIN = "protein";
public static final String COLUMN_FAT = "fat";
public static final String COLUMN_CARBOHYDRATE = "carbohydrate";
public static final String COLUMN_DATE = "date";
// SQL query to create the breakfast table
private static final String CREATE_BREAKFAST_TABLE = "CREATE TABLE " + TABLE_BREAKFAST + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_PRODUCT_NAME + " TEXT, " +
COLUMN_GRAMS + " REAL, " +
COLUMN_CALORIES + " REAL, " +
COLUMN_PROTEIN + " REAL, " +
COLUMN_FAT + " REAL, " +
COLUMN_CARBOHYDRATE + " REAL, " +
COLUMN_DATE + " TEXT);";
static final String TABLE_CALORIES_SUMMARY = "calories_summary";
public static final String COLUMN_DATE_SUMMARY = "date_summary";
public static final String COLUMN_TOTAL_CALORIES = "total_calories";
// SQL query to create the calories_summary table
// SQL query to create the calories_summary table
private static final String CREATE_CALORIES_SUMMARY_TABLE = "CREATE TABLE " + TABLE_CALORIES_SUMMARY + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_DATE_SUMMARY + " TEXT, " +
COLUMN_TOTAL_CALORIES + " REAL);";
static final String TABLE_PROTEIN_SUMMARY = "protein_summary";
public static final String COLUMN_DATE_SUMMARY_PROTEIN = "date_summary_protein";
public static final String COLUMN_TOTAL_PROTEIN = "total_protein";
// SQL query to create the calories_summary table
// SQL query to create the calories_summary table
private static final String CREATE_PROTEIN_SUMMARY_TABLE = "CREATE TABLE " + TABLE_PROTEIN_SUMMARY + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_DATE_SUMMARY_PROTEIN + " TEXT, " +
COLUMN_TOTAL_PROTEIN + " REAL);";
public BreakfastDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BREAKFAST_TABLE);
db.execSQL(CREATE_CALORIES_SUMMARY_TABLE);
db.execSQL(CREATE_PROTEIN_SUMMARY_TABLE);
Log.d("BreakfastDatabaseHelper", "Tables created: breakfast, calories_summary");
}
public void updateCaloriesSummary(String date) {
// Выполняем запрос для получения суммы калорий по выбранной дате с округлением до сотых
String query = "SELECT ROUND(SUM(" + COLUMN_CALORIES + "), 2) FROM " + TABLE_BREAKFAST +
" WHERE " + COLUMN_DATE + " = ?";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, new String[]{date});
double totalCalories = 0;
// Если есть результат, переходим к первой записи
if (cursor.moveToFirst()) {
totalCalories = cursor.getDouble(0);
}
cursor.close();
// Теперь вставляем или обновляем данные в таблице calories_summary
ContentValues values = new ContentValues();
values.put(COLUMN_DATE_SUMMARY, date);
values.put(COLUMN_TOTAL_CALORIES, totalCalories);
db = this.getWritableDatabase();
db.replace(TABLE_CALORIES_SUMMARY, null, values);
db.close();
}
public double getTotalCaloriesSummary(String date) {
// Выполняем запрос для получения суммы калорий из таблицы calories_summary по выбранной дате
String query = "SELECT " + COLUMN_TOTAL_CALORIES + " FROM " + TABLE_CALORIES_SUMMARY +
" WHERE " + COLUMN_DATE_SUMMARY + " = ?" +
" ORDER BY " + COLUMN_ID + " DESC"; // Упорядочиваем по убыванию id
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, new String[]{date});
double totalCalories = 0;
// Если есть результат, переходим к первой записи
if (cursor.moveToFirst()) {
totalCalories = cursor.getDouble(0);
}
cursor.close();
db.close();
return totalCalories;
}
public void updateProteinSummary(String date) {
// Выполняем запрос для получения суммы калорий по выбранной дате с округлением до сотых
String query = "SELECT ROUND(SUM(" + COLUMN_PROTEIN + "), 2) FROM " + TABLE_BREAKFAST +
" WHERE " + COLUMN_DATE + " = ?";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, new String[]{date});
double totalProtein = 0;
// Если есть результат, переходим к первой записи
if (cursor.moveToFirst()) {
totalProtein = cursor.getDouble(0);
}
cursor.close();
// Теперь вставляем или обновляем данные в таблице protein_summary
ContentValues values = new ContentValues();
values.put(COLUMN_DATE_SUMMARY_PROTEIN, date);
values.put(COLUMN_TOTAL_PROTEIN, totalProtein);
db = this.getWritableDatabase();
db.replace(TABLE_PROTEIN_SUMMARY, null, values);
db.close();
}
public double getTotalProteinSummary(String date) {
// Выполняем запрос для получения суммы калорий из таблицы protein_summary по выбранной дате
String query = "SELECT " + COLUMN_TOTAL_PROTEIN + " FROM " + TABLE_PROTEIN_SUMMARY +
" WHERE " + COLUMN_DATE_SUMMARY_PROTEIN + " = ?" +
" ORDER BY " + COLUMN_ID + " DESC"; // Упорядочиваем по убыванию id
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, new String[]{date});
double totalProtein = 0;
// Если есть результат, переходим к первой записи
if (cursor.moveToFirst()) {
totalProtein = cursor.getDouble(0);
}
cursor.close();
db.close();
return totalProtein;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("BreakfastDatabaseHelper", "Upgrading database from version " + oldVersion + " to " + newVersion);
// Handle database upgrades if needed
}
}
现在我想创建一个表“ Protein_summary”。我通过类比“calories_summary”来做到这一点,将 db.execSQL(CREATE_PROTEIN_SUMMARY_TABLE) 行添加到 onCreate 方法中,但未创建表。这可能与什么有关?
onCreate
方法仅在数据库不存在时调用。修改模式的典型方法是利用 onUpgrade
方法。当版本号增加时,会调用 onUpgrade
方法。
因此,您需要增加版本号
DATABASE_VERSION
(通常将其增加 1),然后让 onUpgrade 方法创建表,指出您应该通过测试 oldVersion
和 newVersion
来满足相应的升级。
您还应该更新
onCreate
以创建修改后的架构,以便新安装为该版本创建正确的架构。
如果您使用
CREATE TABLE IF NO EXISTS ....
而不是 CREATE TABLE ....
,那么您可以让 onUpgrade
调用 onCreate
,这样就只创建缺少的表。