zoukankan      html  css  js  c++  java
  • 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);
            }
            
        }
    }
  • 相关阅读:
    Redhat7.x静默安装19C客户端
    利用增量备份修复DG备库中的gap>>>>>>>>>>>有新增数据文件
    利用增量备份修复DG备库中的gap>>>>>>>>>>>无新增数据文件
    ORA-01665 control file is not a standby control file
    ORA-01110 ORA-01122 ORA-01110 ORA-01200解决办法
    Zabbix5.0+Grafana可视化部署教程
    RedHat 7.5配置bonding双网卡绑定(转)
    11.2.0.1 RAC环境部分磁盘组无法自动挂载,导致数据库实例无法启动(转)
    11.2.0.1 RAC环境经典bug CRS-4124: Oracle High Availability Services startup failed.
    Git配置SSH及常用命令
  • 原文地址:https://www.cnblogs.com/rivercast/p/6118296.html
Copyright © 2011-2022 走看看