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 数据库的升级 和 降级的更多相关文章

  1. Android版本升级同时Sqlite数据库的升级及之前数据的保留

    http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...

  2. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  3. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  4. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  5. Android sqlite数据库存取图片信息

    Android sqlite数据库存取图片信息 存储图片:bitmap private byte[] getIconData(Bitmap bitmap){ int size = bitmap.get ...

  6. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持

    IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...

  7. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

  8. Android(java)学习笔记192:SQLite数据库(表)的创建 以及 SQLite数据库的升级

    一.数据库的创建 1.文件的创建      //引用,如果文件不存在是不会创建的   File  file = new File("haha.txt"):     //输出流写数据 ...

  9. Android(java)学习笔记135:SQLite数据库(表)的创建 以及 SQLite数据库的升级

    一.数据库的创建 1.文件的创建      //引用,如果文件不存在是不会创建的   File  file = new File("haha.txt"):     //输出流写数据 ...

随机推荐

  1. JavaScript Scoping and Hoisting

    JavaScript中所有变量及函数名会自动提升 http://www.cnblogs.com/betarabbit/archive/2012/01/28/2330446.html

  2. Java Web学习系列——创建基于Maven的Web项目

    创建Maven Web项目 在MyEclipse for Spring中新建Maven项目 选择项目类型,在Artifact Id中选择maven-archetype-webapp 输入Group I ...

  3. Vim 插件之 NERDTree

    设置快键键 编辑 .vimrc 添加以下内容后,可以使用 ctrl + n 来开关 NERDTree 插件. map <silent> <C-n> :NERDTreeToggl ...

  4. ArcGIS如何将表连接到空间数据上

    当我们有一些空间数据和一些业务数据(表),希望把业务数据和空间数据连接起来时,可以采用ArcGIS Desktop进行操作.本文将介绍如何在ArcGIS Destop中将表和空间数据关联起来. Arc ...

  5. ruby -- 问题解决(五)页面返回跳转

    今天在做页面跳转的时候,google了下页面跳转的方法, 跳转到上一个页面:redirect_to :back <%= link_to "返回" ,:back %> 这 ...

  6. Robot Framework自动化测试(二)---元素定位

    说明: 不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了seleni ...

  7. 编码神器——Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  8. iOS-开发技巧-页面布局

    #pragma mark - Life Cycle//1.初始化//2.view did load//3.view will appear…#pragma mark - System Delegate ...

  9. Linux磁盘操作命令

    查看本地磁盘使用情况:df或者df -l单位为k 容量便于查看,以1024单位换算为M或者G等:df -h或者df -lh 以1000为单位换算:df -H 显示文件系统类型:df -T 显示指定文件 ...

  10. CentOS6.5菜鸟之旅:识别NTFS分区

    一.前言 CentOS默认时不能识别NTFS分区的,需要那么需要安装fuse-ntfs-3g来处理了. 二.安装fuse-ntfs-3g     yum install fuse-ntfs-3g