Android SQLite 使用

Posted by Vison on July 5, 2017

SQLite简介

SQLite是一款轻量级的关系型数据库。支持标准的SQL语法,还遵循数据库的ACID事务。相比较Realm等数据库,我更倾向于SQLite,大多数开发者 对SQL语法较为熟悉,上手较快。另一方面,Realm数据库虽然较为轻量,但在事务方面的表现不如SQLite,Android又在SDK中集成了SQLite, 使用起来不需要额外依赖。所以至少在Android平台上,SQLite数据库是第一选择。

创建数据库

Android提供了SQLiteOpenHelper工具类,只需要新建一个类继承SQLiteOpenHelper,并实现onCreate和onUpgrade方法即可。 为了以后数据库升级和App各版本兼容考虑,onCreate方法中应该只有第一个稳定版本的数据库建表语句,然后调用onUpgrade方法升级到当前数据库版本。 数据库的升级代码都应该在onUpgrade方法中,这样可以保证用户无论安装任何版本都会从基础数据库开始升级,直至升级到当前版本。

public class SqLiteHelper extends SQLiteOpenHelper {


    private static final String DATABASE_NAME  = "finance.db"; //数据库名称

    private static final int FIRST_DATABASE_VERSION  = 1; //初始数据库版本

    private static final int DATABASE_VERSION  = 3; //当前数据库版本

    public SqLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //实现方法  是一个回调方法
    //在创建数据库时调用
    //什么时候创建数据库:连接数据库的时候,如果数据库文件不存在
    //只调用一次
    public void onCreate(SQLiteDatabase db) {
        createTable(db);
        onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION)
    }

    //升级数据库,使用for实现跨版本升级数据库
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
            case 1:
                upgradeToVersion2(db);
                break;
            case 2:
                upgradeToVersion3(db);
                break;
            default:
                break;
            }
        }
    }

    private void createTable (SQLiteDatabase db) {
        db.execSQL(DbProject.CREATE_PROJECT_TABLE);
        db.execSQL(DbCategory.CREATE_CATEGORY_TABLE);
        db.execSQL(DbMoney.CREATE_MONEY_TABLE);
    }

    private void upgradeToVersion2(SQLiteDatabase db){
        // Project表新增1个字段
        String sql = "ALTER TABLE " + DbProject.DATABASE_TABLE_PROJECT + " ADD COLUMN is_deleted VARCHAR";
        db.execSQL(sql);
    }

     private void upgradeToVersion3(SQLiteDatabase db){
        // Category表新增1个字段
        String sql = "ALTER TABLE " + DbCategory.DATABASE_TABLE_CATEGORY + " ADD COLUMN is_deleted VARCHAR";
        db.execSQL(sql);
    }

}

升级数据库

数据库升级主要有两种情况:

  • 从未安装过该App 直接执行SQLitehelper 中的onCreate()方法 onCreate()方法中只执行第一个版本的数据库脚本,然后手动调用onUpgrade(),onUpgrade()中进行for循环和switch…case for循环是进行数据库的连续升级,switch…case根据版本号执行相应的升级方法;
  • 安装过老版本App(更新App)     执行SQLitehelper 中的onUpgrade()方法, 同样进行循环升级;

备份数据库

如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。

  • 将表名改为临时表         ALTER TABLE t_project RENAME TO t_temp_project;

  • 创建新表 CREATE TABLE t_project (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);   
  • 导入数据 INSERT INTO t_project SELECT OrderId, “”, ProductId FROM t_temp_project;   (注意 双引号”” 是用来补充原来不存在的数据的)   
  • 删除临时表   DROP TABLE t_temp_project;

通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。

提升数据库版本号

数据库版本若没有提升到最新,下次启动应用还会进行升级,影响效率及对数据库数据造成影响