Android 使用 Sqlite 数据升级问题

发布于 2024-03-18 04:48:04 字数 2869 浏览 14 评论 0

本周着手开发数据同步的功能,但首先要解决的就是 sqlite 数据库升级的问题,关于数据库升级有蛮多方面涉及到,也许你是新增加了功能,所以新建了表,也许你为某些表增加了些字段,也许你是重构了数据模型与数据结构,不管如何升级,必须要满足用户正常升级的情况下原来的数据不会丢失。关于正确的数据库升级做法网上资料比较少,这次就来介绍下看到的国外一位大牛总结的数据库升级的正确做法。

Version 1 of your database

大多数我们都是用 android 提供的 SQLiteOpenHelper 来创建和管理数据库,如下代码:

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

    private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32);";

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

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE_SAMPLE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Do nothing for now
    }
}

上述代码每次执行的时候都会检查当前版本的数据库是否存在,如果不存在则会执行 onCreate 方法来创建新的数据库,然后会把数据库的名字和版本号存储起来;如果已经存在,则会比较当前版本和 DATABASE_VERSION 的大小,然后就会去执行 onUpgrade 方法。

Version 2 of your database

问题是,最好的处理升级的方法是什么,这里认为最好的方法是循环处理每一个版本的数据库变化,看示例:

假设下一版本想为 tblSample 表新增一个 address 的字段,新的创建语句应该像这样:

CREATE TABLE tblSample
(
    _id integer primary key autoincrement,
    name varchar(32),
    address varchar(128)
); 

那么看下新的代码会是什么样的:

public class DbHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "mysample.db";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32), address varchar(128);";

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

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE_SAMPLE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
                case 1:
            	    db.execSQL("ALTER TABLE tblSample ADD address varchar(128)");
            	    break;
            }
        }
    }
}

代码逻辑很简单,就是一个 for 循环加上 switch...case... 语句,然后上述代码却能处理所有的数据库升级,不管你是从版本 1 升级到版本 9 也好,还是从版本 4 升级到版本 5 也好,都可以从容的解决,确切的说,它将能解决从之前的所有版本升级到当前最新的版本。

须要说明的是,如果有些莫名其妙的用户从高版本升级到低版本(确切的说是降级),例如从版本 3 不小心降级到版本 1 了,这种情况下如果只是有了上述代码则就会抛出异常,造成系统崩溃。android 中数据库降级则会执行 onDowngrade 方法,为防止有这种情况发生,同样须要重新这个方法防止程序的异常。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

荆棘i

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文