android studio环境下的用法
我的工程里把xutils 2.x作为一个module库给主程序用的,所以可以修改xutils的源码来实现需求的变更。
一、添加资源:
前往:https://github.com/sqlcipher/sqlcipher-android-tests ,下载sqlcipher tests 提取assets目录下的icudt46l.zip和libs目录下的sqlcipher.jar、jniLibs目录下的libdatabase_sqlcipher.so、libsqlcipher_android.so、libstlport_shared.so到你主工程下,jniLibs目录的看你支持的cpu而定。然后,提取libs目录下的sqlcipher.jar到你的xutils库工程的libs下。
二、配置工程:
主工程的Dependencies 选项中sqlcipher.jar的Scope设置为Compile,xutils库工程中sqlcipher.jar的Scope设置为Provided,编译和支持用。
三、修改xutils中的DbUtils:
DaoConfig添加pwd:
public static class DaoConfig { private Context context; private String dbName = "xUtils.db"; // default db name private int dbVersion = 1; private DbUpgradeListener dbUpgradeListener; private String dbDir; private String pwd;//密码配置 public DaoConfig(Context context) { this.context = context.getApplicationContext(); } public Context getContext() { return context; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getDbName() { return dbName; } public void setDbName(String dbName) { if (!TextUtils.isEmpty(dbName)) { this.dbName = dbName; } } public int getDbVersion() { return dbVersion; } public void setDbVersion(int dbVersion) { this.dbVersion = dbVersion; } public DbUpgradeListener getDbUpgradeListener() { return dbUpgradeListener; } public void setDbUpgradeListener(DbUpgradeListener dbUpgradeListener) { this.dbUpgradeListener = dbUpgradeListener; } public String getDbDir() { return dbDir; } /** * set database dir * * @param dbDir If dbDir is null or empty, use the app default db dir. */ public void setDbDir(String dbDir) { this.dbDir = dbDir; } }
create方法添加password参数,如下:
public static DbUtils create(Context context,String pwd) { DaoConfig config = new DaoConfig(context); config.setPwd(pwd);//添加密码 return getInstance(config); } public static DbUtils create(Context context, String dbName,String pwd) { DaoConfig config = new DaoConfig(context); config.setDbName(dbName); config.setPwd(pwd);//添加密码 return getInstance(config); } public static DbUtils create(Context context, String dbDir, String dbName,String pwd) { DaoConfig config = new DaoConfig(context); config.setDbDir(dbDir); config.setDbName(dbName); config.setPwd(pwd);//添加密码 return getInstance(config); } public static DbUtils create(Context context, String dbName,String pwd, int dbVersion, DbUpgradeListener dbUpgradeListener) { DaoConfig config = new DaoConfig(context); config.setDbName(dbName); config.setPwd(pwd);//添加密码 config.setDbVersion(dbVersion); config.setDbUpgradeListener(dbUpgradeListener); return getInstance(config); } public static DbUtils create(Context context, String dbDir, String dbName,String pwd, int dbVersion, DbUpgradeListener dbUpgradeListener) { DaoConfig config = new DaoConfig(context); config.setDbDir(dbDir); config.setDbName(dbName); config.setPwd(pwd);//添加密码 config.setDbVersion(dbVersion); config.setDbUpgradeListener(dbUpgradeListener); return getInstance(config); }
getInstance 方法添加代码,加载.so动态库:
private synchronized static DbUtils getInstance(DaoConfig daoConfig) { SQLiteDatabase.loadLibs(daoConfig.getContext());//添加动态库 DbUtils dao = daoMap.get(daoConfig.getDbName()); if (dao == null) { dao = new DbUtils(daoConfig); daoMap.put(daoConfig.getDbName(), dao); } else { dao.daoConfig = daoConfig; } // update the database if needed SQLiteDatabase database = dao.database; int oldVersion = database.getVersion(); int newVersion = daoConfig.getDbVersion(); if (oldVersion != newVersion) { if (oldVersion != 0) { DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener(); if (upgradeListener != null) { upgradeListener.onUpgrade(dao, oldVersion, newVersion); } else { try { dao.dropDb(); } catch (DbException e) { LogUtils.e(e.getMessage(), e); } } } database.setVersion(newVersion); } return dao; }
createDatabase方法修改
private SQLiteDatabase createDatabase(DaoConfig config) { SQLiteDatabase result = null; String dbDir = config.getDbDir(); if (!TextUtils.isEmpty(dbDir)) { File dir = new File(dbDir); if (dir.exists() || dir.mkdirs()) { File dbFile = new File(dbDir, config.getDbName()); result = SQLiteDatabase.openOrCreateDatabase(dbFile.getPath(),config.getPwd(),null);//替换为sqlcipher的方法 } } else { //替换为sqlcipher的方法 SQLiteOpenHelper dbhelper = new SQLiteOpenHelper(config.getContext(),config.getDbName(),null,config.getDbVersion()) { @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }; result = dbhelper.getWritableDatabase(config.getPwd()); // result = config.getContext().openOrCreateDatabase(config.getDbName(), 0, null); } return result; }
其它目录下com.lidroid.xuitls.db包下的annotation、converter、sqlite、table的java文件中替换Coursor
//import android.database.Cursor; import net.sqlcipher.Cursor;
这样手术就结束了,DbUtil用法不变就多了pwd参数。
sqlcipher应该是AES加密,我把加密的.db导出来准备用SQLiteManager 和SQLPro for SQLite 这两个工具查看数据库,SQLiteManager需要输入密码,SQLPro for SQLite 打不开。