博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLiteOpenHelper
阅读量:5343 次
发布时间:2019-06-15

本文共 6200 字,大约阅读时间需要 20 分钟。

一、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); } }}

转载于:https://www.cnblogs.com/rivercast/p/6118296.html

你可能感兴趣的文章
BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
查看>>
前端开发中常用工具函数总结
查看>>
c3p0配置详解
查看>>
HTML:图片和视频标签的使用
查看>>
Hibernate学习笔记
查看>>
支持向量机
查看>>
从阿里到微店
查看>>
Qt之QFileIconProvider(根据扩展名获取文件图标、类型)
查看>>
829. 连续整数求和-leetcode
查看>>
设计模式六大原则(3):依赖倒置原则
查看>>
SpringMVC的静态资源无法请求到的解决办法
查看>>
MYSQL索引优化思维导图
查看>>
操作系统---线程
查看>>
(国庆训练) NEERC2017 C. Connections
查看>>
纪中2016.8.11比赛不明总结
查看>>
Web应用程序的基本安全实践
查看>>
个人项目 猜生日游戏
查看>>
PHP 如何自定义函数
查看>>
1093 字符串A+B
查看>>
股票的风险
查看>>