SQLiteOpenHelper
 // 如果数据库文件不存在,只有onCreate()被调用(该方法在创建数据库时被调用一次)
public abstract void onCreate(SQLiteDatabase db);
// 如果数据库文件存在,会调用onUpgrade()方法升级数据库,并更新版本号。
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);

OnCreate : 如果数据库文件不存在,SQLiteOpenHelper在创建数据库文件,打开数据库这个数据库后,调用onCreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。

OnUpgrade : 当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。

新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。

升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

需要对SQLite数据库的结构进行升级:

SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。
并且只能在表的末尾添加字段,比如,为 Student添加两个字段:
 ALTER TABLE Student ADD COLUMN UserPhone VARCHAR;
 ALTER TABLE Student ADD COLUMN UserNickName VARCHAR;

如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。
1. 将表名改为临时表
         ALTER TABLE Student RENAME TO __temp__Student;

2. 创建新表
        CREATE TABLE Student (UserId VARCHAR() PRIMARY KEY ,UserName VARCHAR() NOT NULL ,UserAddress VARCHAR() NOT NULL);
  
3. 导入数据  
         INSERT INTO Student  SELECT UserId, “”, UserAddress FROM __temp__Student;
或者  
        INSERT INTO Student()  SELECT UserId, “”, UserAddress FROM __temp__Student;
* 注意 双引号”” 是用来补充原来不存在的数据的
  
4. 删除临时表  
        DROP TABLE __temp__Student;

  通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
  当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。

获取表中字段:

 // 获取升级前表中的字段
protected String getColumnNames(SQLiteDatabase db, String tableName)
{
  StringBuffer columnNameBuffer = null;
  Cursor c = null;
  try
  {
    c = db.rawQuery( "PRAGMA table_info(" + tableName + ")", null);
    if (null != c) {
      int columnIndex = c.getColumnIndex("name");
      if (-1 == columnIndex) {
        return null;
      }       int index = 0;
      columnNameBuffer = new StringBuffer(c.getCount());
      for ( c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        columnNameBuffer.append(c.getString( columnIndex ));
        columnNameBuffer.append(",");
        index++;
      }
    }
  }
  catch (Exception e) {
    e.printStackTrace();
  }
  finally {
    if (c != null) {
      c.close();
    }
  }
  return columnNameBuffer.toString(); }

加上事物控制:

 // update table
private void updateTable(SQLiteDatabase db, String tableName, String columns)
{
try
{
db.beginTransaction();
String oldColumns = columns.substring(0, columns.length() - 1);
// rename the table
String tempTable = tableName + "texp_temptable";
String renameTableSql = "alter table " + tableName + " rename to " + tempTable;
db.execSQL(renameTableSql);     // drop the oldtable
    String dropTableSql = "drop table if exists " + tableName;
    db.execSQL(dropTableSql);
    // creat table
    String createTableSql = "create table if not exists " + tableName + "(name text, pwd text, tel text)";
    db.execSQL(createTableSql);
    // load data
    String newColume = "tel";
    String newColumns = oldColumns + "," + newColumn;
    String insertSql = "insert into " + tableName + " (" + newColumns + ") " + "select " + oldColumns + "" + " " + " from " + tempTable;
    db.execSql(insertSql);
    db.setTransactionSuccessful();
  }
  catch (Exception e)
  {
    // TODO: handle exception
    Log.i( "tag", e.getMessage() );
  }
  finally
  {
    db.endTransaction();
  }
}

//DBHelper:

 public class DBHelper extends SQLiteOpenHelper {

     private static final String DATABASE_NAME = "student.db";
private static final int DATABASE_VERSION = 1002; private static DBHelper instance = null; public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
} public synchronized static DBHelper getInstance(Context context) {
if (instance == null) {
instance = new DBHelper(context);
}
return instance;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_FAVORITE); // 若不是第一个版本安装,直接执行数据库升级
// 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
final int FIRST_DATABASE_VERSION = 1000;
onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 使用for实现跨版本升级数据库
for (int i = oldVersion; i < newVersion; i++) {
switch (i) {
case 1000:
upgradeToVersion1001(db);
break;
case 1001:
upgradeToVersion1002(db);
break; default:
break;
}
}
} private void upgradeToVersion1001(SQLiteDatabase db){
// student 表新增1个字段
String sql1 = "ALTER TABLE Student ADD COLUMN age VARCHAR";
db.execSQL(sql1);
}
private void upgradeToVersion1002(SQLiteDatabase db){
// student 表新增2个字段, 添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
String sql1 = "ALTER TABLE Student ADD COLUMN tel VARCHAR";
String sql2 = "ALTER TABLE Student ADD COLUMN address VARCHAR";
db.execSQL(sql1);
db.execSQL(sql2);
}
}

Android SQLite数据库升级,怎么做(事物更改)的更多相关文章

  1. Android SQLiteOpenHelper Sqlite数据库升级onUpgrade

    Android Sqlite数据库升级,在Android APP开发之中,非常常见: 在确定原来的数据库版本号之后,在原来数据库版本号+1,就会执行onUpgrade方法,进行数据库升级操作: 在on ...

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

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

  3. Android Sqlite 数据库版本更新

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

  4. Android SQLite 数据库详细介绍

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

  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——SQLite数据库(二)升级数据库、增、删、改、查、事务

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  9. [android] SQLite 数据库的升级 和 降级

    public class SqliteHelp extends SQLiteOpenHelper { /* * context:创建数据库所需的 上下文对象 * name: 数据库名字 * facto ...

随机推荐

  1. element-ui多选框模糊搜索输入文字闪动问题

    .el-select__tags { .el-select__input { width: 50px !important; } } 添加这段代码即可 <el-select v-model=&q ...

  2. word20161229

    1. launch 英[lɔ:ntʃ]美[lɔntʃ, lɑntʃ]vt. 发射; 发动; [计算机]开始(应用程序); 开展(活动.计划等);vi. 投入; 着手进行; 热衷于…;n. 投掷; 大船 ...

  3. Git(2):本地版本库的一些操作

    参考链接:https://www.cnblogs.com/zhuwq585/p/6390542.html

  4. git知识总结-1.git基础之数据存储

    1.前言 git包含四种对象文件: blob tree commit tag(目前没用到,暂时忽略) 2. git对象的关系   图 git三种对象关系   粗略一看,可以大致感觉出blob类似于文件 ...

  5. gitlab 权限说明

    五.权限说明 Guest(匿名用户) - 创建项目.写留言薄 Reporter(报告人)- 创建项目.写留言薄.拉项目.下载项目.创建代码片 段 Developer(开发者)- 创建项目.写留言薄.拉 ...

  6. nginx unit PHP

    2018-12-26 14:20:33 星期三 综述: nginx unit php 的关系: nginx -> 转发请求到 8300端口 -> unit 转发 8300 收到的请求 -& ...

  7. 三、vue之router

    三.vue之router 此时vue的脚手架.创建项目已经完成. ... vue的运行流程 index.html-->main.js-->App.vue-->router/index ...

  8. springboo+nginx测试反向代理01

    操作环境:centos7,springboot2.1,nginx1.8.1 boot程序链接地址 : https://github.com/zgq7/nginxDemo nginx下载地址: http ...

  9. CentOs7.5安装Redis

    前言 虽说现在都是买服务了,可是自己做的小DEMO偶尔也用用Redis,不会装也不行 变更记录 # 19.4.24  起笔 正文 官网 https://redis.io/ 首先去官网找到最新的链接 截 ...

  10. python3中的type与object

    在python中,一切皆对象,应该怎么理解呢?? 先来看几个例子: [root@localhost ~]# python3 Python 3.6.3rc1 (default, Feb 26 2018, ...