首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个方法内部调用onCreate方法

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

Stack Overflow用户
提问于 2013-05-13 09:15:13
回答 2查看 1.8K关注 0票数 0

我从来没有见过有人显式地从另一个方法内部调用像onCreate()或onDestroy()这样的系统回调方法。只是看起来不对劲。我想我在一些例子中看到了这一点,我不敢相信。这是我的想象还是真实存在?

在下面为SQLiteOpenHelper类的onUpgrade()方法编写的代码中,我从另一个函数显式调用了onCreate()方法。可以从这个方法内部调用onCreate()吗?有没有一种不调用onCreate()的更好的方法呢?

代码语言:javascript
复制
 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-13 09:58:42

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-13 10:00:50

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16513664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档