5、Sqlite数据库升级

一、背景

在Android应用中,UI,网络,数据库是最重要的模块。数据库的设计也十分重要,扩展性,易用性都要考虑。随着应用的升级,原有的数据库不能满足新的需求,增加字段,增加表的情况经常出现。

二、两个方法:

public void onCreate(SQLiteDatabase db)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

三、简单的升级方法:

1、重新创建数据库,数据会丢失:
db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";");
onCreate(db);
2、直接增加字段:
ALTER TABLE Tables.CONTACTS ADD COLUMN NAME;

四、复杂的升级:

1、将表A重命名,改了Table_temp。
2、创建新表Table。
3、将表Table_temp的数据插入到表Table。
4、删除表Table_temp。
protected void upgradeTables(SQLiteDatabase db, String tableName, String columns) {
    try {
        db.beginTransaction();



        // 1, Rename table.
        String tempTableName = tableName + "_temp";
        String sql = "ALTER TABLE " + tableName +" RENAME TO " + tempTableName;
        execSQL(db, sql, null);

        // 2, Create table.
        onCreateTable(db);

        // 3, Load data
        sql = "INSERT INTO " + tableName + " (" + columns + ") " + " SELECT " + columns + " FROM " + tempTableName;
        execSQL(db, sql, null);

        // 4, Drop the temporary table.
        execSQL(db, "DROP TABLE IF EXISTS " + tempTableName, null);


        db.setTransactionSuccessful();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
     } finally {
        db.endTransaction();
     }
}

五、不同版本的数据库升级。

1、通常情况下,每一次数据库升级都会增加字段或者表,用户并不一定一直跟随你的步伐,每次都会升级,这样就可能存在跨版本升级。
2、假如用户A使用1.0版本的数据库只有一个表Contacts(10列)。用户B使用1.1版本的数据库,有Contacts表(10列)和Calls表(5列)。现在需要更新1.2版本,有Contacts表(12列)和Calls表(5列)。
3、这样的用户A和用户B需要升级的话,需要定义:
V1.0-->V1.2     10-->12
V1.1-->V1.2       11-->12
4、实现onUpgrade:
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        int upgradeVersion = oldVersion;
         if (10 == upgradeVersion) {
            // Create table Calls
            String sql = "CREATE TABLE ...";
            db.execSQL(sql);
            upgradeVersion = 11;
        }

     if (11 == upgradeVersion) {
        // Modify table Contacts
        upgradeVersion = 12;
    }

    if (upgradeVersion != newVersion) {
        // Drop tables
        db.execSQL("DROP TABLE IF EXISTS " + tableName);
        // Create tables
        onCreate(db);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值