SQLite是Android内置的一个很小的关系型数据库。SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类。我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定义操作。下面两个方法必须重写:

  • public void onCreate(SQLiteDatabase db)

  • public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

另外SQLiteOpenHelper子类在构造实例时必须指定当前数据库的名称(name)、版本号(version)。而这里名称就决定了数据库存储 时的文件名称,而这里的版本号与App在AndroidMainfest.xml定义的versionCode没有绝对关联。也就是在App更新时如果数 据库的数据结构没有发生变化那么数据库的版本号则不用增加。

onCreate:调用时机是用户首次安装应用后启动,或是清除App数据库文件后启动。这时可以在这个函数中完成初始的数据表的创建。

onUpgrade:调用时机是用户在做应用更新,覆盖安装后启动,如果新版本中数据库版本号要比旧版本中的数据库版本号高则会调用。这时可以在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。

还有一个一般情况下不需要重写,但在应用出现逆向降级(如应用由版本号4降级安装版本号为3的包)时必须重写的方法onDowngrade,如果应用降级覆盖安装时没有重写该方法则会崩溃。

在数据库版本升级时, 我们可能会遇到这样一些情况:

  • 需要扩展一个表的字段

  • 删除掉原来表上某个冗余的字段

  • 新建一个表

而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。这里我们假设用户手机上之前安装的是数据库版本为1的包,升级安装的是数据库版本号为2的包。这时我们要在数据库版本为2的包在去处理这些升级逻辑。

首先是扩展一个表的字段在onUpgrade中的实现为:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//旧数据库版本为1,才为表pedant添加一个student_name字段if(oldVersion < 2) {db.execSQL("ALTER TABLE pedant ADD COLUMN student_name text");}
}

SQLite对ALTER TABLE的支持是有限的,你可以在一个存在表上添加一个字段到末尾,或者是改变表的名称。但如果你想做更复杂的操作,比如删除一个表已有的字段,就要重新创建这个表并完成数据迁移,而不能使用DROP COLUMN这样方便的命令了。详见SQLite Frequently Questions

比如表pedant原来有三个字段a、b、c,现在想删除c字段,那么在onUpgrade中写法如下:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//旧数据库版本为1,删除表pedant的c字段if(oldVersion < 2) {db.beginTransaction();try {db.execSQL("CREATE TEMPORARY TABLE pe_backup (a, b);");db.execSQL("INSERT INTO pe_backup SELECT a, b FROM pedant;");db.execSQL("DROP TABLE pedant;");db.execSQL("CREATE TABLE pedant(a text, b text);");db.execSQL("INSERT INTO pedant SELECT a, b FROM pe_backup;");db.execSQL("DROP TABLE pe_backup;");db.setTransactionSuccessful();} finally {db.endTransaction();}}
}

这样就既完成了对c字段的删除也保留了原来表上的数据。

最后一种情况最简单直接执行CREATE语句就要可以了。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//旧数据库版本为1,创建新表newtbif(oldVersion < 2) {db.execSQL("CREATE TABLE newtb(a text, b text);");}
}

转载于:https://blog.51cto.com/wangzhaoli/1751337

Android SQLite数据库升级的问题相关推荐

  1. Android SQLite数据库版本升级(分逐级升级和跨版本升级)

    参考:Android Sqlite数据库跨版本升级 保存之前数据 本文说的数据库升级是基于Android原生APISQLiteOpenHelper实现的逻辑,不涉及第三方库.其实如果使用官方推荐的Ro ...

  2. android SQLite数据库的使用

    今天,简单讲讲android如何使用SQLite数据库.  最近,自己在做一个功能时又用到了SQLite数据库,发现自己还是掌握的不很全面.其实之前的app里面也一直用到了数据库,但是自己没有花时 ...

  3. Android SQLite 数据库详细介绍

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

  4. android 数据库表格数据库数据库中,Android SQLite数据库中的表详解

    Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的 ...

  5. 利用SQLChiper对Android SQLite数据库加密

    利用SQLChiper对Android SQLite数据库加密 前言: 上篇文章讲了Android studio+SQLCipher加密SQLite数据库的几个坑,跳过这几个坑,那么SQLCipher ...

  6. android 获取位置数据库,尝试从webview获取位置时,Android“SQLite数据库无法从/CachedGeoposition.db加载”错误...

    我正在创建一个使用webkit和chrome客户端的android应用程序.我希望能够在网页请求时获取当前位置.我设置的网页适用于普通浏览器就好了.然而,当我尝试访问该网页WebKit中,我不断收到此 ...

  7. Android SQLite数据库导出/导入Excel

    Android SQLite数据库导出/导入Excel 前言 框架 使用方法 添加依赖 声明权限 导出数据库到Excel 声明实例 配置导出内容 导出监听 导入Excel到数据库 声明实例 导入监听 ...

  8. Android Sqlite数据库多表联合查询

    Android Sqlite数据库多表联合查询示例 工作上用数据库存储文件还是很便利的,所以有时候发现一张表存储数据感觉数据结构不是很清晰的时候,就需要新加第二张表或者多张表来进行联合查询对象信,一般 ...

  9. android sqlite数据库加密,(转)SQLite数据库的加密

    1.创建空的SQLite数据库. //数据库名的后缀你可以直接指定,甚至没有后缀都可以 //方法一:创建一个空sqlite数据库,用IO的方式 FileStream fs = File.Create( ...

最新文章

  1. smartcrop.js智能图片裁剪库
  2. 史上最强 NIO 框架,没有之一!!!
  3. 程序员面试题精选100题(58)-八皇后问题[算法]
  4. buu 密码学的心声
  5. 安检X光机下的春运归家图 宛如一幅幅水彩画
  6. 处理32人!永久取消申报基金/报奖资格……又一批科研不端案例被通报批评
  7. 不懂函数能学c语言吗,不会函数能学C语言吗
  8. mysql c api简单连接池
  9. SCI 投稿Cover letter模板大全
  10. 搜狗浏览器安装第三方插件(crx和zip)
  11. 如何通过蒲公英批量获取iPhone设备的udid
  12. #《神奇动物:邓布利多之谜》
  13. 【 MySQL1064错误代码】
  14. java8新特性之一:流式数据处理(包含list,map数据处理)。
  15. JS 按钮下一步 下拉菜单内容转换
  16. java 刷题ide,力扣(LeetCode)刷题神器之Vs Code
  17. 1+1为什么等于2(哥德巴赫猜想)
  18. 教你小小JAVA爬虫爬到HDU首页(只为学习)
  19. c 语言 如何设置串口波特率,STC89C52RC串口波特率程序
  20. 程序员职场起点6要素 前辈们那些经历告诉你

热门文章

  1. IOS中延时执行的几种方式的比较
  2. C# ToString格式字符串整理(Format)(数字、日期和枚举的标准格式设置说明符)
  3. 解析淘宝商城缘何更名“天猫”
  4. java ant 详解
  5. Android系统启动过程
  6. error: failed to launch '/private/var/mobile/Applications/** busy解决办法
  7. Java中加载properties文件的6种方法
  8. scrollview 中用listview的方法
  9. Ubuntu帮大忙了
  10. 2018-12-21 作业