[android] SQLite 数据库的升级 和 降级
public class SqliteHelp extends SQLiteOpenHelper {
/*
* context:创建数据库所需的 上下文对象
* name: 数据库名字
* factory 游标 查询的时候使用
* version 指定数据库的版本高版本会自动更新 低版本的(自定义调用 铺面ongrade)
* */
public SqliteHelp(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// 数据库第一次使用的时候 执行
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("info", "数据库第一次使用的时候 执行");
db.execSQL("create table info(name text)");
}
//数据库升级版本时候执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i("info", "更新数据库的时候会调用这个方法" +oldVersion +newVersion);
db.execSQL("drop table if exists aa");
db.execSQL("create table aa(name text)");
}
// 降低数据库版本时调用
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
// 开启 或 禁止 写入 日志 到 数据库
//setWriteAheadLoggingEnabled(boolean enabled)
//Enables or disables the use of write-ahead logging for the database.
}
// 要在注册表 中注册 测试类
public class AndroidSqliteTest extends AndroidTestCase {
private int Vision=1; private SqliteHelp sqliteHelp;
private SQLiteDatabase db;
private Cursor cursor; //启动 一个测试类时
//自动执行setUp(Runner调用)方法,可以对一些对象进行赋值
@Override
protected void setUp() throws Exception {
super.setUp();
Log.i("info", "在所有方法之前执行");
// 配置 数据库的 创建信息
sqliteHelp = new SqliteHelp(this.getContext(), "test.db", null, Vision); // 通过工具类来创建 数据库 对象
//getReadableDatabase() 创建 和打开一个数据库
//getWritableDatabase() 创建 和打开一个数据库 并且会帮你 创建 你定义过的 表 视图
db = sqliteHelp.getWritableDatabase(); // 可以 有 写入日志 和外键的支持 的特性
//to enable features such as write-ahead logging or foreign key support.
//sqliteHelp.onConfigure(db);
} // 测试方法结束后会调用 比如关闭一个数据库的连接 时
@Override
protected void tearDown() throws Exception {
super.tearDown();
sqliteHelp.close();
db.close();
Log.i("info", "在所有方法之后执行");
} // 添加操作
public void insert() throws IOException { // 纯sql 来 插入数据
db.execSQL("insert into info(name) values(?)",new Object[]{"hehe"});
Log.i("info", "成功插入一条数据");
/*InputStream in = this.getContext().getResources().getAssets().open("bg.jpg");
int length =in.available();
byte[] b = new byte[length];
in.read(b);*/
/*ContentValues values = new ContentValues();
values.put("name", "不知道哦");
values.put("pic", b);
long insert = db.insert("aa", null, values);*/
} //查询操作
public void query() {
cursor = db.rawQuery("select * from info ", new String[]{});
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i("info","查询成功"+ name);
}
}
}
1.version =1 时; 创建一个数据库 并且只有一个 name字段 ;
打印的日志为:

2.给表 一条插入 数据 并查询出来:
打印的日志为:

3.升级数据库版本 给数据库(添加一个age字段)
此时把测试类中的 version改为 version=2;
代表 第二版本
1--->2 版本 或 直接 安装 2版本 修改代码为
// 数据库第一次使用的时候 执行
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("info", "数据库第一次使用的时候 执行");
db.execSQL("create table info(name text,age integer)");
} //数据库升级版本时候执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i("info", "数据库升级版本时候执行" +oldVersion +newVersion);
//db.execSQL("drop table if exists info");
if(oldVersion==1){
db.execSQL("alter table info add column age integer");
}
}
打印的日志为:

在插入一条数据:
// 添加操作
public void insert() throws IOException {
// 纯sql 来 插入数据
db.execSQL("insert into info(name,age) values(?,?)",new Object[]{"hehe","18"});
Log.i("info", "成功插入一条数据");
}
打印的日志为:

4.降低为 数据版本为 1 版本时:
把 version =2 改为 version = 1
2--->1;
在次改代码:
//数据库升级版本时候执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i("info", "数据库升级版本时候执行" +oldVersion +newVersion);
//db.execSQL("drop table if exists info");
if(oldVersion==1){
db.execSQL("alter table info add column age integer");
}
} // 降低数据库版本时调用
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.i("info", " 降低数据库版本时调用 " +oldVersion +newVersion);
try {
String rename_sql = "alter table info rename to info_back";
db.execSQL(rename_sql);
Log.i("info", "改名成功"); String sql_message = "create table info (name text)";
db.execSQL(sql_message);
Log.i("info", "重新建立 version =1 时的表结构成功"); String sql_copy = "insert into info select name from info_back";
db.execSQL(sql_copy);
Log.i("info", "copy到用户数据到 version =1 的数据表中去"); String drop_sql = "drop table if exists info_back";
db.execSQL(drop_sql);
Log.i("info", "把备份表drop掉"); } catch (Exception e) {
//失败
Log.i("info", "降级失败,重新建立");
String drop_old_table = "drop table if exists info";
db.execSQL(drop_old_table); }
}
打印的日志为:

可以完成了一个简单的 升级和降级 ;
考虑放到云端(服务器)上去:
1、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
2、考虑[当前]的最低版本要求-->>降低维护成本
3、尽可能本地的数据转移(所有新版本,都不删除字段)-->尽可能把未知变已知 try catch
[android] SQLite 数据库的升级 和 降级的更多相关文章
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...
- Android Sqlite 数据库版本更新
Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...
- Android SQLite 数据库详细介绍
Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- Android sqlite数据库存取图片信息
Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...
- 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持
IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...
- Android——SQLite/数据库 相关知识总结贴
android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...
- Android(java)学习笔记192:SQLite数据库(表)的创建 以及 SQLite数据库的升级
一.数据库的创建 1.文件的创建 //引用,如果文件不存在是不会创建的 File file = new File("haha.txt"): //输出流写数据 ...
- Android(java)学习笔记135:SQLite数据库(表)的创建 以及 SQLite数据库的升级
一.数据库的创建 1.文件的创建 //引用,如果文件不存在是不会创建的 File file = new File("haha.txt"): //输出流写数据 ...
随机推荐
- CSS布局:Float布局过程与老生常谈的三栏布局
原文见博客主站,欢迎大家去评论. 使用CSS布局网页,那是前端的基本功了,什么两栏布局,三栏布局,那也是前端面试的基本题了.一般来说,可以使用CSSposition属性进行布局,或者使用CSSfloa ...
- Mac OS使用ll、la、l等ls的别名命令
在linux下习惯使用ll.la.l等ls别名的童鞋到mac os可就郁闷了-- 其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可: alias ll='ls -al ...
- Knockout 新版应用开发教程之"text"绑定
目的 DOM元素显示文本的值是你传递的参数,前提是text先绑定到该元素上 典型的常用元素 <span>或者<em>习惯性的用来显示文本,但是在技术上来说你可以用任何元素的. ...
- VIM配置相关记录
把一直使用中的vim配置做个GIT入库管理,也把之前积累在机器上的文档,做个汇总. https://github.com/wujuguang/kyvim 1. 安装完整版vim vi和vim的区别?在 ...
- WEB 安全之 SQL注入 < 三 > 提权
SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...
- EPANET源码中用到的几个简单C语言函数介绍三
引自input2.C int getfloat(char *s, double *y)/***---------------------------------------------------- ...
- Lambda表达式和匿名内部类(I)
本文git地址 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过 ...
- 利用session做国际化引起的old区内存爆满及修复方法
题记:昨天加班打车回家,看见前面有辆路虎在高速上开的巨慢,挡住了我坐的出租车的路,于是就跟司机吐槽了一句:“前面这车怎么这么面啊?”,司机沉默了大概3秒,说了一句富含哲理性的话:“没有面车,只有面人” ...
- LVM快照(snapshot)备份
转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv ...
- [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3 ...