[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"): //输出流写数据 ...
随机推荐
- SQL数据类型解释
SQL数据类型解释 1.char.varchar.text.ntext.bigint.int.smallint.tinyint和bit的区别及数据库的数据类型电脑秘籍 2009-05-15 21:47 ...
- Entity Framework Code First ---EF Power Tool MySql
关于如何使用EF Power Tool的介绍请看 http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html, 这里 ...
- Winform快速开发组件的实现(一)
好久好久没有露面了,呵呵,对于写文章都有点生疏了. 在拿到任何一个项目,不管是b/s的还是c/s,我不会立即开始写代码,我一般会为使这些项目能够快速开发制定一系列的支持组件,虽然可能前期会付出一些代价 ...
- UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...
- bootstrap插件学习-bootstrap.tooltip.js
先看bootstrap-tooltip.js的结构 var Tooltip = function ( element, options ){} // 构造器 Tooltip.prototype ={} ...
- Nodejs建站笔记-注册登录流程的简单实现
1. 使用Backbone实现前端hash路由 登录注册页面如下: 初步设想将注册和登录作为两个不同的url实现,但登录和注册功能的差距只有form表单部分,用两个url实现显然开销过大,所以最终方案 ...
- 任督二脉之Shell中的正则表达式
VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...
- rsync同步Nginx日志遇到问题总结
一.目的 将nginx 日志通过普通用户利用rsync公钥认证的方式实时同步到本地服务器上,之后使用elk程序进行处理. 二.遇到问题及解决方法思路 问题1.文件权限:nginx 的日志默认权限如下: ...
- SQL Server 2014,改善的临时表缓存
在一些先决条件下,SQL Server可以缓存临时表(cache Temp Tables).缓存临时表意味着当你创建反复创建同个临时表时,SQL Server就可以重用它们.这会从整体上大幅度提高你的 ...
- sublime text3 安装package
在sublime text2中安装package control插件的时候是执行python: import urllib2,os; pf='Package Control.sublime-packa ...