是否曾调用过onUpgrade方法?

Moh*_*nde 33 java android android-sqlite

是永远叫做的onUpgrade方法SQLiteOpenHelper吗?如果是这样,什么时候被召唤?如果开发人员没有调用它,那为什么呢?这个功能到底发生了什么?我已经看到了删除所有表的示例,但随后评论说放弃所有表并不是你应该做的.有什么建议?

laz*_*ist 36

对于那些想知道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
}
Run Code Online (Sandbox Code Playgroud)

现在...... 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上只有在调用getWriteableDatabase()时才会调用onUpgrade. (3认同)

dev*_*ini 28

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

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

New Version:
dbName = "mydb.db"
dbVersion = 2
Run Code Online (Sandbox Code Playgroud)

在内容提供程序的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
        }

}
Run Code Online (Sandbox Code Playgroud)

  • 那么就会出现一个新问题:"dbVersion"何时发生变化?开发人员控制了吗?喜欢app的"appVersion"? (2认同)

ogn*_*ian 21

当您构造一个版本比打开的数据库版本更新的SQLiteOpenHelper时,会调用它.做什么取决于旧版本和新版本之间的数据库更改.如果不删除已更改的表,则唯一的情况是更改的位置超过添加的列.然后,您可以使用ALTER TABLE语句将新列添加到表签名.

  • 更改也可能是添加新表,在这种情况下,您可能不会删除任何现有表. (4认同)
  • 但是你怎么会提前知道你会修改一张桌子呢?或者,您每次发布更新时都必须更改方法. (3认同)
  • 您知道何时更改数据库并在onUpgrade中添加另一个案例.因此,当用户更新应用程序时,SQLiteOpenHelper知道现有数据库已过时并采取相应的操作.查看一个Android源代码以供参考:http://android.git.kernel.org/?p = platform/frameworks/base.git; a = blob; f = package/Settingsvider /src/com/android/provider /settings/DatabaseHelper.java (3认同)
  • 要快速访问@ognian在浏览器中引用的代码,请查看[GrepCode上的DatabaseHelper](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android /4.0.1_r1/com/android/providers/settings/DatabaseHelper.java#DatabaseHelper). (2认同)

小智 5

查看所有帖子并运行调试代码,当我看到 onUpgrade 被调用时,我仍然不清楚。我开始认为 Android 有一个严重的缺陷..

此页面上的信息使我做出了最终决定。非常感谢所有贡献者!

这为我解决了它...

public class DatabaseHelper extends SQLiteOpenHelper {
    public static String TAG = DatabaseHelper.class.getName();
    private static final int DATABASE_VERSION = 42;
    private static final String DATABASE_NAME = "app_database";
    private static final String OLD_TABLE = "old_and_useless";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion ) {
        if( newVersion > oldVersion) {
            Log.d( TAG, "cool! you noticed." );

            db.execSQL( "DROP TABLE IF EXISTS " + OLD_TABLE );
            // other calls like onCreate if necessary

        } else {
            Log.d( TAG, "Hey! didn't you see me?" );
        }

    }

    public void checkDatabaseVersion() {
        SQLiteDatabase db = this.getWritableDatabase();

        // if the DATABASE_VERSION is newer
        //    onUpgrade is called before this is reached
    }


    // other code removed for readability...
}
Run Code Online (Sandbox Code Playgroud)

getWritableDatabase() 和 getReadableDatabase() 确实会导致 onUpgrade 调用。我没有检查其他方法,因为这些方法符合我的需要。

继续阅读,踢球者来了……

当我终于意识到 db 版本在我的调试过程中正在更新时,我最初的 Activity 中的这段代码启发了我…… 呃!

DatabaseHelper dbHelper = new DatabaseHelper( this );
dbHelper.checkDatabaseVersion();
Run Code Online (Sandbox Code Playgroud)

注意:调用 DatabaseHelper 构造函数会更新数据库版本

在构造函数调用之后,数据库被标记为新版本。在调用 getWritableDatabase() 或 getReadableDatabase() 之前终止应用程序,您将使用新版本。此后新的执行永远不会调用 onUpgrade 方法,直到 DATABASE_VERSION 再次增加。(叹气!现在看起来明显可笑 :)

我的建议是在应用程序的早期阶段添加某种“checkDatabaseVersion()”。或者,如果您创建 SQLiteOpenHelper 对象,请确保在应用程序终止之前调用其中一种方法(getWritableDatabase()、getReadableDatabase() 等)。

我希望这可以让其他人免于同样的头疼!...:p