SQLiteOpenHelper

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLiteOpenHelper相关的知识,希望对你有一定的参考价值。

一、SQLiteOpenHelper的使用方法

    1、SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。 
    2、可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。 
    3、所有继承了这个类的类都必须实现下面这样的一个构造方法: 
        public DatabaseHelper(Context context, String name, CursorFactory factory, int version) 
          contextContext类型,上下文对象 
          nameString类型,数据库的名称 
          factoryCursorFactory类型 
          versionint类型,数据库版本 

    下面是这个类的几个方法: 
      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之onCreate例子

SQLiteOpenHelper/SQLiteDatabase/Cursor源码解析

SQLiteOpenHelper/SQLiteDatabase/Cursor源码解析

SQLiteOpenHelper 调用 onCreate 失败?

我从 SQLiteOpenHelper 派生的类变得越来越大

Android-SQLiteOpenHelper里增删改查