我不明白为什么我必须直接将代码放在我的 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,然后插入数据。