Android 动态获取数据库需要的准备工作

1.需要用到SQLCipher ,它是目前比较流行的一款开源的SQLite加密工具 SQLCipher,对数据文件进行加密,当然微信也在使用。 SQLCipher是完全开源的,其代码托管在github上。SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,也增加了一些自己的接口。它有一个缺点就是使用该库之后会导致Apk会变大6M左右。下面主要说明在代码中如何使用SQLCipher的提供的接口。
1.下载库文件:点击下载
2.解压文件可以得到所需要的库文件,都在在lib和assets文件夹下 :Android 动态获取数据库需要的准备工作_第1张图片
3.导入到Android工程中 :
a.首先将assets目录下的icudt46l压缩包拷贝到对应Android工程下的assets目录下 :
Android 动态获取数据库需要的准备工作_第2张图片
b. 导入sqlcipher.jar包
SQLCipher file
c.将lib下面文件夹中的so库导入到对应Android工程中:
Android 动态获取数据库需要的准备工作_第3张图片

4.使用SQLCipher数据库
SQLCipher数据库用法相比于Android原生数据库用法,除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。只是导包的时候替换成SQLCipher的数据库文件,如下:

import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;

所有有关数据库的代码,只要修改引入的包成SQLCipher的包,就可以完美替换(原先的代码不需变动),在用法上只两个注意点就可以了,其余的一模一样。下面介绍两个不同点,其余的数据库操作用法一样。
a.初始化时需要初始化库:必须先调用:

SQLiteDatabase.loadLibs(context);

然后再执行数据库相关的操作,建议在Application中初始化,或者在初始化单例SQLiteOpenHelper的时候初始化。
b.获取数据库db对象时需要传入key:

db = sqLiteOpenHelper.getWritableDatabase(password);

这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
c.还有就是利用指定密码连接加密的数据库文件:


/**
 * 连接数据库
 *
 * @param dbFile
 */
private void openWxDb(File dbFile) {
    Context context = MyApplication.getContextObject();
    SQLiteDatabase.loadLibs(context);
    SQLiteDatabaseHook hook = new SQLiteDatabaseHook() {
        public void preKey(SQLiteDatabase database) {
        }
 
        public void postKey(SQLiteDatabase database) {
            database.rawExecSQL("PRAGMA cipher_migrate;"); //兼容2.0的数据库
        }
    };
 
    try {
        //打开数据库连接
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, mDbPassword, null, hook);
        //查询等数据库操作
        Cursor c1 = db.rawQuery("select * from table1", null);
        while (c1.moveToNext()) {
            String userName = c1.getString(c1.getColumnIndex("username"));
            String nickName = c1.getString(c1.getColumnIndex("password"));
        }
        c1.close();
        db.close();
    } catch (Exception e) {
        LogUtil.log("读取数据库信息失败" + e.toString());
//            e.printStackTrace();
    }
}

你可能感兴趣的:(Android,Studio)