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