从另一个方法内部调用onCreate方法

时间:2013-05-13 01:15:13

标签: android sqlite android-contentprovider oncreate sqliteopenhelper

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

2 个答案:

答案 0 :(得分:1)

首先,onUpgrade()是SQLiteHelper中的抽象方法,因此不会自动调用onCreate()。

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

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

答案 1 :(得分:0)

这里的调用是正确的,onCreate()仅在首次创建数据库时调用一次。更改数据库版本时调用onUpgrade。因此,当您将表放在onUpgrade中时,您必须在那里调用onCreate以创建新表,并更改onCreate以反映新表。