在安卓开发中,SQLite数据库的版本更新通过SQLiteOpenHelper
的onUpgrade()
方法实现,当应用的数据库版本号(DATABASE_VERSION
)增加时,系统会触发onUpgrade()
方法,开发者需在此方法中定义数据库结构的变更逻辑(如新增表、修改字段等)。
SQLiteOpenHelper
子类public class DatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 3; // 当前版本号 private static final String DATABASE_NAME = "app.db"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 首次创建数据库时的逻辑(如初始化表结构) db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 根据版本号差异执行迁移逻辑 if (oldVersion == 1 && newVersion == 2) { // 版本1→2:新增字段 db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER"); } else if (oldVersion == 2 && newVersion == 3) { // 版本2→3:创建新表 db.execSQL("CREATE TABLE orders (id INTEGER PRIMARY KEY, userId INTEGER)"); } // 其他版本迁移逻辑... } }
当应用运行时,若数据库版本低于DATABASE_VERSION
,系统会自动调用onUpgrade()
。
DatabaseHelper helper = new DatabaseHelper(context); SQLiteDatabase db = helper.getWritableDatabase(); // 触发onUpgrade()
迁移场景 | 解决方案 |
---|---|
新增字段 | 使用ALTER TABLE 添加字段,并为旧数据设置默认值。 |
修改字段类型 | 创建临时表→复制数据→删除旧表→重命名新表。 |
删除表 | 需先备份数据,迁移到新表结构后删除旧表。 |
复杂逻辑 | 使用事务保证原子性,或拆分为多个版本升级步骤。 |
DATABASE_VERSION
为旧版本号,运行应用生成旧数据库文件。DATABASE_VERSION
改回新版本号,运行应用触发onUpgrade()
。问题1:onUpgrade()
未执行
原因:未更新DATABASE_VERSION
或未调用getWritableDatabase()
。
解决:确保版本号递增,并在应用启动时获取数据库实例。
问题2:数据丢失
原因:直接删除表或未处理旧数据。
解决:优先使用ALTER TABLE
,必要时备份数据并逐步迁移。
解答:SQLite不支持直接降级版本号,若需回滚,需手动删除应用数据(如/data/data/包名/databases/
目录下的文件),但会导致数据丢失,推荐通过版本控制逐步升级,避免频繁回滚。
解答:可使用以下策略:
Migration
类定义每一步操作)。