【问题标题】:calling onCreate method from inside another method从另一个方法内部调用 onCreate 方法
【发布时间】:2013-05-13 01:15:13
【问题描述】:

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

【问题讨论】:

  • 你为什么还要这样做而不使用startActivity()
  • 我看到在某些示例中使用了对 onCreate() 的调用,但是如果对 startActivity() 的调用是更好的方法,我会改为尝试
  • 我生活在另一个宇宙吗?为什么所有 cmets 和答案都建议您使用 startActivity?我以为你向我们展示的这个东西是关于 SQLiteOpenHelper 的?所以它应该调用new DatabaseHelper(context) 吗?而且不,onUpgrade 将在 onCreate 之后调用,不需要在 onUpgrade 中显式调用 onCreate,这是非常糟糕的示例之一。
  • @Kevik 抱歉,我看到了 onCreate()onDestroy() 并以为你在谈论从那里开始一个单独的 Activity 并跳了枪
  • @Chor WaiChun 说 onUpgrade 在 onCreate 之后调用的文件在哪里?

标签: android sqlite android-contentprovider oncreate sqliteopenhelper


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多