0

我从未见过有人从另一个方法内部显式调用其中一个系统回调方法,例如 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
4

2 回答 2

1

首先onUpgrade()是SQLiteHelper中的一个抽象方法,所以不会自动调用onCreate()。

是的,看到外部调用的生命周期方法很奇怪,但在这种情况下是正确的。onUpgrade() 的这种特殊(幼稚)实现盲目地删除表并以与第一个数据库创建相同的方式重新创建它。对于不需要在数据库升级时保存用户数据的应用程序,这是一个可以正常工作的快捷方式。

为每个表设置一个私有的 createTableName() 方法,然后在 onCreate() 和 onUpgrade() 中调用这些方法可能会更有意义。毕竟,每次推送应用程序更新并更改数据库结构时,简单地“忘记”所有用户数据并不是一个好的一般做法。删除并重新创建已更改的表会更有意义。即使这样,您也希望暂时“保存”用户的数据并将其转储到新创建的表中,以考虑新/删除的列。或者,如果您的应用程序将用户数据保存到服务器,您可以删除并重新创建所有表,然后立即触发同步。

于 2013-05-13T02:00:50.047 回答
0

The call there is correct, onCreate() is only called once when the database is first created. onUpgrade is called when the database version is changed. Thus when you drop the table in onUpgrade you have to call onCreate there to create new table with the onCreate changed to reflect the new table.

于 2013-05-13T01:58:41.633 回答