dinggela 发表于 2016-12-2 06:35:34

在Android中afinal框架下实现sqlite数据库版本升级的办法

1
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version)



 
这个方法在实现时需要重写。
onUpgrade方法会在数据库需要升级的时候调用。可以用来增删表或者其他任何操作。如果你想添加新的列你可以使用ALTER TABLE 插入表中。如果需要重命名或者删掉列,可以使用ALTER TABLE 重命名旧表,然后创建新的表,并将旧表数据添加到新表中。如果抛出异常,将自动回滚。
 
1. 帮助文档里说的“数据库升级”是指什么?
你开发了一个程序,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了。
2. 数据库升级应该注意什么?
软件的1.0版本升级到1.1版本时,老的数据不能丢。那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。
3. 程序如何知道数据库需要升级?
SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
4. 何时触发数据库升级?如何升级?
当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。
新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。
-----------------------------------------------------------------------------------------------------------------
上面采用的是SQLiteOpenHelper中的onUpgrade方法实现数据库的升级。
     首先获取Context:
?
1
private Context  mContext=this;



 
然后实现FinalDb内的静态方法:
 
?
1
FinalDb.create(mContext,"afinal.db",true,2,this);



 
实现FinalDb的DbUpdateListener接口中的方法:
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
 
        // TODO Auto-generated method stub
        try {
            InputStream in = mContext.getAssets().open("patch.sql");
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(in));
            String sqlUpdate = null;
            while ((sqlUpdate = bufferedReader.readLine()) != null) {
                if (!TextUtils.isEmpty(sqlUpdate)) {
                    db.execSQL(sqlUpdate);
                }
            }
            bufferedReader.close();
            in.close();
        } catch (SQLException e) {
            System.out.println(e.toString());
        } catch (IOException e) {
            System.out.println(e.toString());
        }  
    }



 
时间紧迫,没有写太多,大家可以自己研究。
页: [1]
查看完整版本: 在Android中afinal框架下实现sqlite数据库版本升级的办法