我从来没有见过有人显式地从另一个方法内部调用像onCreate()或onDestroy()这样的系统回调方法。只是看起来不对劲。我想我在一些例子中看到了这一点,我不敢相信。这是我的想象还是真实存在?
在下面为SQLiteOpenHelper类的onUpgrade()方法编写的代码中,我从另一个函数显式调用了onCreate()方法。可以从这个方法内部调用onCreate()吗?有没有一种不调用onCreate()的更好的方法呢?
private static class DatabaseHelper extends SQLiteOpenHelper{
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + LentItems.NOTE_ID + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
LentItems.TITLE + " TEXT, " + LentItems.TEXT + " TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int previousVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db); // <-- EXPLICIT CALL TO ONCREATE
}
} // end DatabaseHelper inner class发布于 2013-05-13 09:58:42
这里的调用是正确的,onCreate()只在第一次创建数据库时调用一次。当数据库版本发生更改时,将调用onUpgrade。因此,当您将表放到onUpgrade中时,您必须在那里调用onCreate来创建新表,并更改onCreate以反映新表。
发布于 2013-05-13 10:00:50
首先,onUpgrade()是SQLiteHelper中的一个抽象方法,因此不会自动调用onCreate()。
是的,看到一个外部调用的生命周期方法是很奇怪的,但在这种情况下它是正确的。onUpgrade()的这个特殊的(幼稚的)实现盲目地删除表,并以与第一次创建数据库相同的方式重新创建它。对于不需要在数据库升级时保存用户数据的应用程序,这是一个工作正常的快捷方式。
让每个表都有一个私有的createTableName()方法,然后在onCreate()和onUpgrade()中调用这些方法可能会更有意义。毕竟,每次使用数据库结构更改推送应用程序更新时,简单地“忘记”所有用户数据并不是一种好的常规做法。只删除并重新创建已更改的表会更有意义。即使这样,您也可能希望临时“保存”用户的数据,并将其转储到新创建的表中,同时考虑到新的/删除的列。或者,如果您的应用程序将用户数据保存到服务器,您可以删除并重新创建所有表,然后立即触发同步。
https://stackoverflow.com/questions/16513664
复制相似问题