【问题标题】:Why does SQLiteOpenHelper drop the table in "onUpgrade" method?为什么 SQLiteOpenHelper 在“onUpgrade”方法中删除表?
【发布时间】:2013-11-29 02:22:00
【问题描述】:

我最近学习了一种在 Android 操作系统上使用 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);
    }
}

【问题讨论】:

  • drop table 命令由您的代码调用,而不是系统调用。您可以随意将其取出并执行迁移逻辑。
  • 你知道为什么学习的代码会执行“drop table”吗?
  • 我想知道这部分。

标签: android android-sqlite


【解决方案1】:

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

是的

为什么需要“onUpgrade”方法?

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

你知道为什么学习的代码会执行“drop table”吗?

方便。这不一定是正确的方法,但是数据库更改会使获取旧数据并将其合并到新表中变得困难。因此,从逻辑上讲,简单地重新开始会更容易。

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

【讨论】:

  • 是的。当您创建一个新的SQLiteHelper 对象时,会检查数据库版本,如果需要,会调用onUpgrade()
  • 感谢您的回答。 :D
【解决方案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");
       }
   }

【讨论】:

  • 感谢您的详细解释。 :D
【解决方案3】:

OnUpgrade()db versions“新旧”不匹配时调用;这意味着用户想要更改数据库结构(删除表、添加新表、修改表定义)。

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

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

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 2016-09-17
相关资源
最近更新 更多