为什么SQLiteOpenHelper在“onUpgrade”方法中删除表?

时间:2013-11-29 02:22:00

标签: android android-sqlite

我最近学会了在Android OS上使用SQLite3的方法。 但它有一个不可接受的部分。

我无法理解为什么在调用SQLiteOpenHelper的“onUpgrade”方法时删除表。 为什么需要“onUpgarde”方法?

如果代码执行“drop table”,旧版本DB的表数据将被删除,不是吗?

为什么要删除旧数据库的现有数据?

如何在删除表时恢复现有的数据库数据?


[这是学习代码]

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    final String CONFIRMED_SHEETS_TABLE = "confirmed_sheets";

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "create table" +
                CONFIRMED_SHEETS_TABLE +
                "_id integer primary key autoincrement, " +
                "group text, " +
                "num001 text, " +
                "num002 text, " +
                "num003 text, " +
                "num004 text, " +
                "num005 text, " +
                "num006 text, " +
                "date text)";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

        // non acceptable part //
        String sql = "drop table if exists " + CONFIRMED_SHEETS_TABLE;
        sqLiteDatabase.execSQL(sql);

        onCreate(sqLiteDatabase);
    }
}

3 个答案:

答案 0 :(得分:5)

  

如果代码执行" drop table",旧版本DB的DB表数据将是   删除了,不是吗?

  

为什么需要" onUpgrade"方法

如果要切换数据库(例如,因为您添加了新列),您的应用程序(通常)现在取决于该更改。增加Helper类中的数据库版本会调用onUpgrade(),这使您可以处理任何迁移以准备应用程序以使用新架构。

  

您知道为什么学习代码会执行" drop table"?

便利。它不一定是正确的方法,但数据库更改可能会使旧数据难以合并并将其合并到新表中。因此,简单地重新开始就更容易逻辑化。

如果要合并现有表和新表,请查看this question

答案 1 :(得分:2)

您不需要在onUpgrade()中执行DROP TABLE,因为它当前已在您的代码中编写。 onUpgrade()的目的是让您的应用检查是否在用户的设备上安装了新版本的应用数据库,如果是,如果您的数据库有任何更改,例如添加新列,您可以在onUpgrade()内进行更改。如果您从未更改数据库架构,则无需在onUpgrade()中执行任何操作。

有关Android中数据库的更多信息和入门教程,请参阅记事本示例代码here

编辑:此外,这是我为其中一个应用编写的onUpgrade()示例:

  /**
    * Handle upgrades to the database.
    */
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       if(DBG) Utils.log(TAG, "DBHelper: onUpgrade()...");

       // Logs that the database is being upgraded
       Utils.log(TAG, "w", "Upgrading database from version " + oldVersion + " to "
               + newVersion);

       /*
        * Every time you add new columns to the database in the phone, you will want
        * to increment the Database version above and then add a condition in here for
        * upgrading to it. Otherwise it will cause upgrading users to be nontrivial and
        * lead to unnecessary crashes or upgrade instructions.
        */
       if (newVersion > oldVersion && newVersion <= 4) {
           db.execSQL("ALTER TABLE " + TrackerDb.SomeTable.TABLE_NAME + " ADD COLUMN "
                   + TrackerDb.SomeTable.COLUMN_NAME_DATE_MODIFIED + " TEXT");
       }
   }

答案 2 :(得分:1)

OnUpgrade()“新旧”不匹配时,会调用

db versions;这意味着用户想要更改数据库结构(删除表,添加新表,修改表定义)。

所以OnUpgrade()应该包含逻辑:

  1. 备份现有数据(例如,为现有数据生成插入语句 数据)。
  2. 相应地修改数据库结构。
  3. 从备份中恢复数据。