SQLite如何升级数据库

熟悉SQLite的同学都知道 我们继承SQLiteOpenHelper 要重写两个方法

	@Override
	public void onCreate(SQLiteDatabase db) {
	//第一次创建数据库恩文件时候才会执行,之后不会再执行
	}
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	//数据库版本号比之前的版本大才会执行这个方法

	}


之前面试的时候有被面试官问到,什么时候会用到这两个方法,应该如何使用?

这里代码就不写了,说一下使用场景吧

 比如 我们新建了一张表 book.db 

public String CREATE_BOOK = "create table BOOK ("
	+"id integer primary key autoincrement,"
	+"price real,"
	+"name text,"
	+"pages integer";
db.exexSQL(CREATE_BOOK );


1、现在有需求,需要增加字段

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 使用for实现跨版本升级数据库
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
            case 1:
                upgradeToVersion2(db);
                break;
            case 2:
                upgradeToVersion3(db);
                break;
                 
            default:
                break;
            }
        }
    }
     
    private void upgradeToVersion2(SQLiteDatabase db){
        // favorite表新增1个字段
        String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN deleted VARCHAR";
        db.execSQL(sql1);
    }
    private void upgradeToVersion3(SQLiteDatabase db){
        // favorite表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
        String sql1 = "ALTER TABLE "+表名E+" ADD COLUMN message VARCHAR";
        String sql2 = "ALTER TABLE "+表名+" ADD COLUMN type VARCHAR";
        db.execSQL(sql1);
        db.execSQL(sql2);
    }

2、如何我们想再添加一张 Category表用于图书的分类

public String CREATE_CATEGORY = "create table CATEGORY
 ("
	+"id integer primary key autoincrement,"
	+"name text,"
	+"code integer";
db.exexSQL(CREATE_CATEGORY );


假如用户此时的app数据库版本为1,想要新增一张表有两种方法

一、卸载程序,重新下载最新app(比较极端)

二、升级数据库(升级APP时,覆盖安装app,包名路径下的文件包括数据库,不会删除)


那要怎么书写代码呢?

...

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK );
		db.execSQL(CREATE_CATEGORY );
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("drop table if exists BOOK");
		db.execSQL("drop table if exists CATEGORY");
		onCreate(db);
	}

....

记得改版本号



猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/72883657