MST
星途 面试题库

面试题:SQLite 数据库升级过程中的数据迁移与兼容性处理

在 Android 应用开发中,随着业务需求的变化,SQLite 数据库需要升级,假设现有数据库版本为 1,要升级到版本 2。数据库中有一张用户信息表 `users`,包含 `user_id`(主键自增)、`username`、`age` 字段。升级后需要新增一个 `email` 字段,同时要将旧数据中用户名包含特定字符串(如 'old_')的用户数据迁移到一张新表 `old_users` 中,新表结构与 `users` 表相同。请详细描述实现这个数据库升级及数据迁移的步骤和关键代码(以 Java 语言为例)。
39.9万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试
  1. 数据库升级步骤
    • 定义数据库版本:在 SQLiteOpenHelper 子类的构造函数中定义当前数据库版本。
    • 重写 onUpgrade 方法:在该方法中执行数据库升级逻辑,包括添加新字段、创建新表和迁移数据。
  2. 关键代码
    • 数据库帮助类 DBHelper
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "mydb.db";
    private static final int DATABASE_VERSION = 1;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createUsersTable = "CREATE TABLE users (" +
                "user_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "username TEXT," +
                "age INTEGER)";
        db.execSQL(createUsersTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion == 1 && newVersion == 2) {
            // 添加email字段
            db.execSQL("ALTER TABLE users ADD COLUMN email TEXT");
            // 创建old_users表
            db.execSQL("CREATE TABLE old_users (" +
                    "user_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                    "username TEXT," +
                    "age INTEGER, " +
                    "email TEXT)");
            // 迁移数据
            db.execSQL("INSERT INTO old_users (user_id, username, age, email) " +
                    "SELECT user_id, username, age, email FROM users WHERE username LIKE 'old_%'");
            // 从users表删除迁移的数据
            db.execSQL("DELETE FROM users WHERE username LIKE 'old_%'");
        }
    }
}
  • 使用数据库帮助类
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity {
    private Context context;

    public MainActivity(Context context) {
        this.context = context;
    }

    public void performDatabaseOperations() {
        DBHelper dbHelper = new DBHelper(context);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        // 这里可以执行其他数据库操作,如插入、查询等
        db.close();
    }
}

以上代码实现了将 SQLite 数据库从版本 1 升级到版本 2 的过程,包括添加新字段和迁移特定数据到新表。在实际应用中,可能需要更多的错误处理和优化。