SQLiteOpenHelper
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLiteOpenHelper相关的知识,希望对你有一定的参考价值。
一、SQLiteOpenHelper的使用方法
1、SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。
2、可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。
3、所有继承了这个类的类都必须实现下面这样的一个构造方法:
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
context:Context类型,上下文对象
name:String类型,数据库的名称
factory:CursorFactory类型
version:int类型,数据库版本
下面是这个类的几个方法:
getReadableDatabase() 创建或打开一个数据库 可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作
getWritableDatabase() 创建或打开一个可以读写的数据库
onCreate(SQLiteDatabase db)第一次创建的时候调用
onOpen(SQLiteDatabase db) 打开数据库
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 升级数据库
onDowngrade(SQLiteDatabase db,int oldVersion,int newVersion) 降级数据库
close()关闭所有打开的数据库对象
在了解以上的方法后我们可以动手试试:
1、在onCreate方法中创建表,并且初始化表
public class Sqlite extends SQLiteOpenHelper{ /** * context:上下文对象 * name:数据库名称 * factory * version:当前数据库的版本,值必须是整数并且是递增的状态 */ private static final String name = "t_acd.db"; private static final int version =2; public Sqlite(Context context) { //必须通过super调用父类当中的构造函数 super(context, name, null, version); } @Override //onCreate只有在没有数据库的情况下才会执行,不会重复执行 public void onCreate(SQLiteDatabase db) { Log.e("TAG", "没有数据库,创建数据库"); String sql = "create table t(id int primary key,name varchar(20),isdel bit default 0)"; //执行sql语句创建表 db.execSQL(sql); Log.e("TAG", "执行db.execSQL()"); String sql1 = "insert into t values(1,‘zs‘,0)"; String sql2 = "insert into t values(2,‘ls‘,0)"; String sql3 = "insert into t values(3,‘ws‘,0)"; String sql4 = "insert into t values(4,‘ss‘,0)"; //执行sql语句 db.execSQL(sql1); db.execSQL(sql2); db.execSQL(sql3); db.execSQL(sql4); Log.e("TAG", "执行添加"); } }
2、创建了数据库对象,下面我们就可以利用这个对象对数据库进行操作了,首先我们需要在MainActivity中的OnCreate方法中初始化该数据库对象。
Sqlite dbHelper = new Sqlite(this);//初始化
3、但是我们还不能直接使用dbHelper访问数据库,必须通过它的WritableDatabase属性或ReadableDatabase属性获取对应权限的数据库访问对象,WritableDataBase可以对数据库进行全部操作,ReadableDatabase可以对数据库进行读取操作。他们的返回类型都是SQLiteDataBase。所以我们还要根据需要获取他们的对象。
dbHelper .getWritableDatabase().close();//获取对象,并关闭
关于数据库升级onUpgrade和降级onDowngrade的使用
1、升级数据库
当我们第一次建立数据库时,数据库版本为1。当后续开发,由于业务需求的改变需要修改更改了数据库里的某个表的表结构。
这时候就会出现一些难题:
有些用户已经使用版本1,很多数据存储在数据库了,这个时候,他想安装新的版本2,怎么办? 怎么才能让数据不丢失?
有的用户直接装了最新版本,那这些用户就直接使用了新的表结构格式。
可能以后还有版本3,4,N,怎么保证“数据不丢失的情况下“让用户手机里的数据库跟着升级?
这个时候我们就需要用到onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 这个方法
2、降级数据库
当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。
这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚
以下是升级数据库和降级数据库的一个小案例:
public class Sqlite extends SQLiteOpenHelper{ /** * context:上下文对象 * name:数据库名称 * factory * version:当前数据库的版本,值必须是整数并且是递增的状态 */ private static final String name = "t_acd.db"; private static final int version =2; public Sqlite(Context context) { //必须通过super调用父类当中的构造函数 super(context, name, null, version); } @Override //onCreate只有在没有数据库的情况下才会执行,不会重复执行 public void onCreate(SQLiteDatabase db) { Log.e("TAG", "没有数据库,创建数据库,新用户直接从0升级到4.0"); String sql = "create table t(id int primary key,name varchar(20),isdel bit default 0)"; //执行sql语句创建表 db.execSQL(sql); Log.e("TAG", "执行db.execSQL()"); String sql1 = "insert into t values(1,‘zs‘,0)"; String sql2 = "insert into t values(2,‘ls‘,0)"; String sql3 = "insert into t values(3,‘ws‘,0)"; String sql4 = "insert into t values(4,‘ss‘,0)"; //执行sql语句 db.execSQL(sql1); db.execSQL(sql2); db.execSQL(sql3); db.execSQL(sql4); Log.e("TAG", "执行添加"); } //升级 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion==1){//判断版本号 String sql1 = "insert into t values(1,‘zs‘)"; String sql2 = "insert into t values(2,‘ls‘)"; String sql3 = "insert into t values(3,‘ws‘)"; //执行sql语句 db.execSQL(sql1); db.execSQL(sql2); db.execSQL(sql3); Log.e("TAG", "执行添加,升级到v2.0"); } if(oldVersion==2){ String sql = "alter table t add column isdel bit default 0";//插入数据 //执行sql语句 db.execSQL(sql); Log.e("TAG", "从v2.0升级到v3.0"); } if(oldVersion==3){ String sql = "insert into t values(4,‘ss‘,0)"; //执行sql语句 db.execSQL(sql); Log.e("TAG", "从v3.0升级到v4.0"); } } //降级 @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { //从4.0降低到3.0 try { //把未来的表改名 String rename_sql = "alter table t rename to t_bak"; db.execSQL(rename_sql); Log.e("TAG", "改名成功"); //建立2.0的表结构 String sql_message = "create table t(id int primary key,name varchar(20))"; db.execSQL(sql_message); Log.e("TAG", "建立2.0表结构成功"); //吧备份的数据,copy到新的2.0的表 String sql_copy = "insert into t select id,name from t_bak"; db.execSQL(sql_copy); Log.e("TAG", "复制数据到2.0"); //删除drop表 String sql_drop = "drop table if exists t_bak"; db.execSQL(sql_drop); Log.e("TAG", "删除成功,降级到2.0成功"); } catch (Exception e) { //失败 Log.e("TAG", "降级失败,重新建立"); String Sql_drop = "drop table if exists t"; db.execSQL(Sql_drop); //重新创建2.0的表结构 String sql_message = "create table t(id int primary key,name varchar(20))"; db.execSQL(sql_message); //添加 String sql1 = "insert into t values(1,‘zs‘)"; String sql2 = "insert into t values(2,‘ls‘)"; String sql3 = "insert into t values(3,‘ws‘)"; db.execSQL(sql1); db.execSQL(sql2); db.execSQL(sql3); } } }
以上是关于SQLiteOpenHelper的主要内容,如果未能解决你的问题,请参考以下文章
SQLiteOpenHelper/SQLiteDatabase/Cursor源码解析
SQLiteOpenHelper/SQLiteDatabase/Cursor源码解析
SQLiteOpenHelper 调用 onCreate 失败?