当前位置:Gxlcms > 数据库问题 > SQLiteOpenHelper

SQLiteOpenHelper

时间:2021-07-01 10:21:17 帮助过:19人阅读

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

标签:except   factor   exec   text   primary   表结构   升级   read   读写   

人气教程排行