我不明白为什么我必须直接将代码放在我的 SQLiteOpenHelper 的 onCreate 中
I don't get why I HAVE to directly put code in the onCreate of my SQLiteOpenHelper
我已经解决了我的代码中不允许我向我的 SQLite 数据库添加记录的问题。尽管我已经修复了它,但我并没有真正理解我的第一个代码有什么问题,所以如果有人愿意帮助我理解,请解释一下!
我的第一个代码:
package com.example.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "DatabaseName";
public static final int DATABASE_VERSION = 2;
public StarbuzzDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
updateMyDatabase(db, 0, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
updateMyDatabase(db, oldVersion, newVersion);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion){
if (oldVersion < 1){
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
}
}
public static void insertDrink(SQLiteDatabase db,
String name,
String description,
int resourceID,
boolean favorite){
ContentValues drinkValues = new ContentValues();
drinkValues.put("NAME", name);
drinkValues.put("DESCRIPTION", description);
drinkValues.put("IMAGE_RESOURCE_ID", resourceID);
drinkValues.put("FAVORITE", favorite);
db.insert("DRINK", null, drinkValues);
}
}
我的新密码:
package com.example.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "DatabaseName";
public static final int DATABASE_VERSION = 2;
public StarbuzzDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// updateMyDatabase(db, 0, DATABASE_VERSION);
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
//Due to update version 2
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// updateMyDatabase(db, oldVersion, newVersion);
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion){
/* if (oldVersion < 1){
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
} */
}
public static void insertDrink(SQLiteDatabase db,
String name,
String description,
int resourceID,
boolean favorite){
ContentValues drinkValues = new ContentValues();
drinkValues.put("NAME", name);
drinkValues.put("DESCRIPTION", description);
drinkValues.put("IMAGE_RESOURCE_ID", resourceID);
drinkValues.put("FAVORITE", favorite);
db.insert("DRINK", null, drinkValues);
}
}
使用 updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion) 的全部意义在于,我可以按照我正在阅读的书中的说明,用一种方法管理数据库中的更改:Head First Android 开发,第 2 版。问题是数据库已创建,但它是空的,因此 insertDrink() 方法不起作用。我认为它应该有效。
为了解决这个问题,我尝试通过直接在自身内部的 onCreate() 中将 运行 所需的所有代码添加到传统方法中来解决这个问题。这解决了问题,但是当我跟踪第一个代码如何 运行 时,我真的认为结果应该没有任何不同。谁能解释一下?
顺便说一句,如果您需要任何其他信息或代码,我非常愿意提供任何信息。
提前为我的英语感到抱歉,它不是我的母语。
在您的第一个代码中,您在尝试向其中插入数据后添加 FAVORITE
列。在第二个代码中,您首先使用 FAVORITE
列创建 table,然后插入数据。
我已经解决了我的代码中不允许我向我的 SQLite 数据库添加记录的问题。尽管我已经修复了它,但我并没有真正理解我的第一个代码有什么问题,所以如果有人愿意帮助我理解,请解释一下!
我的第一个代码:
package com.example.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "DatabaseName";
public static final int DATABASE_VERSION = 2;
public StarbuzzDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
updateMyDatabase(db, 0, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
updateMyDatabase(db, oldVersion, newVersion);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion){
if (oldVersion < 1){
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
}
}
public static void insertDrink(SQLiteDatabase db,
String name,
String description,
int resourceID,
boolean favorite){
ContentValues drinkValues = new ContentValues();
drinkValues.put("NAME", name);
drinkValues.put("DESCRIPTION", description);
drinkValues.put("IMAGE_RESOURCE_ID", resourceID);
drinkValues.put("FAVORITE", favorite);
db.insert("DRINK", null, drinkValues);
}
}
我的新密码:
package com.example.starbuzz;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class StarbuzzDatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "DatabaseName";
public static final int DATABASE_VERSION = 2;
public StarbuzzDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// updateMyDatabase(db, 0, DATABASE_VERSION);
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
//Due to update version 2
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// updateMyDatabase(db, oldVersion, newVersion);
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
}
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion){
/* if (oldVersion < 1){
db.execSQL("CREATE TABLE DRINK (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"NAME TEXT," +
"DESCRIPTION TEXT," +
"IMAGE_RESOURCE_ID INTEGER);");
insertDrink(db, "Latte", "Expresso and steamed milk", R.drawable.latte, false);
insertDrink(db, "Cappuccino", "Expresso, hot milk, and a steamed milk foam", R.drawable.cappuccino, true);
insertDrink(db, "Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter, false);
}
if (oldVersion < 2){
db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC");
} */
}
public static void insertDrink(SQLiteDatabase db,
String name,
String description,
int resourceID,
boolean favorite){
ContentValues drinkValues = new ContentValues();
drinkValues.put("NAME", name);
drinkValues.put("DESCRIPTION", description);
drinkValues.put("IMAGE_RESOURCE_ID", resourceID);
drinkValues.put("FAVORITE", favorite);
db.insert("DRINK", null, drinkValues);
}
}
使用 updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion) 的全部意义在于,我可以按照我正在阅读的书中的说明,用一种方法管理数据库中的更改:Head First Android 开发,第 2 版。问题是数据库已创建,但它是空的,因此 insertDrink() 方法不起作用。我认为它应该有效。
为了解决这个问题,我尝试通过直接在自身内部的 onCreate() 中将 运行 所需的所有代码添加到传统方法中来解决这个问题。这解决了问题,但是当我跟踪第一个代码如何 运行 时,我真的认为结果应该没有任何不同。谁能解释一下?
顺便说一句,如果您需要任何其他信息或代码,我非常愿意提供任何信息。 提前为我的英语感到抱歉,它不是我的母语。
在您的第一个代码中,您在尝试向其中插入数据后添加 FAVORITE
列。在第二个代码中,您首先使用 FAVORITE
列创建 table,然后插入数据。