是否曾经调用过 onUpgrade 方法?

2022-09-01 04:51:29

SQLiteOpenHelperonUpgrade方法曾经被调用过吗?如果是这样,它何时被调用,由什么调用?如果它没有被开发人员调用,那么为什么它在那里?该函数到底发生了什么?我看过一些例子,它删除了所有的表,但后来有一条评论说,删除所有表不是你应该做的。有什么建议吗?


答案 1

对于那些想知道被呼叫的确切时刻的人来说,它是在呼叫或.onUpgrade()getReadableDatabase()getWriteableDatabase()

对于那些不清楚它如何确保它被触发的人来说,答案是:当提供给构造函数的数据库版本更新时,它就会被触发。下面是一个示例SqLiteOpenHelper

public class dbSchemaHelper extends SQLiteOpenHelper {

private String sql;
private final String D_TAG = "FundExpense";
//update this to get onUpgrade() method of sqliteopenhelper class called
static final int DB_VERSION = 2; 
static final String DB_NAME = "fundExpenseManager";

public dbSchemaHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    // TODO Auto-generated constructor stub
}

现在...onUpgrade()

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    sql = "ALTER TABLE " + fundExpenseSchema.Expense.TABLE_NAME + " ADD COLUMN " + fundExpenseSchema.Expense.FUNDID + " INTEGER";
    arg0.execSQL(sql);
}

答案 2

如果您使用的是 SQLiteOpenHelper,则每当您更改 DB 版本时,都会调用 onUpgrade。为此,还有一个额外的要求。数据库名称必须保持不变。

Old Version:
dbName = "mydb.db"
dbVersion = 1

New Version:
dbName = "mydb.db"
dbVersion = 2

在内容提供程序的 onCreate 中,您可以创建一个采用这些参数的 SQLiteOpenHelper 实例。您的 SQLiteOpenHelper 实现将如下所示:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {

        public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
            super(context, dbName, null, dbVersion);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //Code to create your db here
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Code to upgrade your db here
        }

}

推荐