public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫。

 
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:

private Context  mContext=this;

然後實現FinalDb內的靜態方法:

FinalDb.create(mContext,"afinal.db",true,2,this);

實現FinalDb的DbUpdateListener接口中的方法:

@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());
}
}

時間緊迫,沒有寫太多,大家可以自己研究。

在Android中afinal框架下實現sqlite數據庫版本升級的辦法的更多相关文章

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

    上一篇文章采用的是SQLiteOpenHelper中的onUpgrade方法实现数据库的升级. 首先获取Context: private Context mContext=this; 然后实现Fina ...

  2. C#在sql中使用變量訪問Oracle數據庫

    1.首先創建一個測試數據表 CREATE TABLE people ( SNO BYTE), SNAME BYTE), SSEX BYTE), SAGE number, SDEPT BYTE), BT ...

  3. android的Afinal框架下的数据库更新

    项目需要,版本升级时给表添加了一些新的字段,发现出现异常. 解决方法:监听数据库的版本号,更新数据库. 创建FinalDb对象时使用如下的构造函数,监听版本号的变化: db = FinalDb.cre ...

  4. [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

    一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...

  5. React-Native 之 GD (二十)removeClippedSubviews / modal放置的顺序 / Android 加载git图\动图 / 去除 Android 中输入框的下划线 / navigationBar

    1.removeClippedSubviews 用于提升大列表的滚动性能.需要给行容器添加样式overflow:’hidden’.(Android已默认添加此样式)此属性默认开启 这个属性是因为在早期 ...

  6. [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法

    本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...

  7. nodejs 中koa框架下的微信公众号开发初始篇

    最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...

  8. afinal框架下 ViewInject的使用

    1.可以在BaseActivity界面onCreate 方法setContentView后加上该语句. initInjectedView(this); 2.@ViewInject(id=R.id.v_ ...

  9. mono for android中使用dapper或petapoco对sqlite进行数据操作

    在mono for android中使用dapper或petapoco,很简单,新建android 类库项目,直接把原来的文件复制过来,对Connection连接报错部分进行注释和修改就可以运行了.( ...

随机推荐

  1. for循环两个略骚的写法

    骚写法 或许你知道,总之我觉得很酷,希望你也这么认为. 递增遍历 最常见场景,从 0 到 10 的遍历,不输出 10: for(let i = -1; ++i < 10;) { console. ...

  2. Linux umask

    新建一个文件或目录,它的默认权限是什么?如果要修改一个用户创建的文件和目录的默认权限该如何做?本文将介绍相关的内容.说明:本文的演示环境为 ubuntu 16.04. 文件的默认权限 为了查看用户创建 ...

  3. 挂载银行前置机Ukey到windows server2012虚拟机的操作记录

    公司有跟银行对接的金融业务,需要配置银行前置机环境.通过KVM的WebVirtMgr管理平台创建windows server2008虚拟机,安装参考:kvm虚拟化管理平台WebVirtMgr部署-完整 ...

  4. C_数据结构_递归自己调用自己

    # include <stdio.h> void f(int n) { ) printf("哈哈\n"); else f(n-i); } int main(void) ...

  5. E. Binary Numbers AND Sum

    链接 [http://codeforces.com/contest/1066/problem/E] 题意 给你长度分别为n,m的二进制串,当b>0时,对a,b,&运算,然后b右移一位,把 ...

  6. Wannafly挑战赛25 B.面积并

    链接 [https://www.nowcoder.com/acm/contest/197/B] 分析 特殊优先考虑 首先考虑r>=l这种情况就是圆的面积了 第二就是r<=内切圆的半径,这个 ...

  7. 701 D. As Fast As Possible

    ###链接 [http://codeforces.com/group/1EzrFFyOc0/contest/701/problem/D] ###题意 n个人,走lm,有车但没人只能坐一次,车容量为k, ...

  8. 个人项目junit4测试

    一.题目简介 用java编写一个程序,模拟ATM柜员机. 二.源码的github链接 www.github.com/liuxianchen/test 三.所设计的模块测试用例.测试结果截图 四  心得 ...

  9. 软件工程项目之摄影App(第二次冲刺)

    第二次冲刺阶段做出了登录,还有首页.基本界面也成型了. 登录验证码是用了mob的验证码skd.

  10. [转] Linux有问必答:如何修复“sshd error: could not load host key”

    编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...