一 流程圖

二 詳解
android 自帶的sqlite可以方便的存儲(chǔ)數(shù)據(jù),但是不夠安全.使用sqlcipher可以對(duì)數(shù)據(jù)庫加密.sqlcipher github地址 , sqlicipher 官方地址

66785E13-A2E4-46F1-82D3-77A825A1490A.jpeg

418C3058-5B71-4523-85B4-A07F401F3725.jpeg
1. 引入sqlcipher庫
compile 'net.zetetic:android-database-sqlcipher:3.5.4@aar'
2. 初始化庫
最好在application調(diào)用 一定要在使用sqlite之前調(diào)用
SQLiteDatabase.loadLibs(this);
- 在gradle中還要配置ndk 不然不能兼容部分手機(jī)
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86","mips"
}
}
3. sqlcipher寫入數(shù)據(jù)
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
public class DBCipherHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "sqlcipher_database";
private static int DATABASE_VERSION = 1;
public DBCipherHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
public interface SQL {
String MY_TABLE = "my_table";
String CREATE_TABLE_SQL = "CREATE TABLE IF NOT EXISTS "+MY_TABLE+" ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "userID VARCHAR, "
+ "value VARCHAR"
+ ")";
//用戶ID
String USERID = "userID";
//值
String VALUE = "value";
}
/**
* sqlcipher寫入
*/
private void sqlcipherWriteIn() {
String userid = mETwritein_cipher.getText().toString().trim();
String value = mEtwritenin_ciphervalue.getText().toString().trim();
if (TextUtils.isEmpty(userid) || TextUtils.isEmpty(value)) {
Toast.makeText(this, "填數(shù)據(jù)啦!!!", Toast.LENGTH_LONG).show();
return;
}
DBCipherHelper mCipherHelper = new DBCipherHelper(this);
net.sqlcipher.database.SQLiteDatabase db = mCipherHelper.getWritableDatabase("secret_key");
ContentValues cv = new ContentValues();
cv.put(SQL.USERID, userid);
cv.put(SQL.VALUE, value);
db.insert(SQL.MY_TABLE, null, cv);
db.close();
}
4. sqlcipher讀出數(shù)據(jù)
/**
* sqlcipher寫出
*/
private void sqlcipherWriteOut() {
DBCipherHelper mCipherHelper = new DBCipherHelper(this);
net.sqlcipher.database.SQLiteDatabase db = mCipherHelper.getWritableDatabase("secret_key");
net.sqlcipher.Cursor cursor = null;
String result = "";
try {
cursor = db.rawQuery("select * from " + SQL.MY_TABLE, null);
while (cursor.moveToNext()) {
String userid = cursor.getString(cursor.getColumnIndex(SQL.USERID));
String value = cursor.getString(cursor.getColumnIndex(SQL.VALUE));
result = result + userid + "," + value + ";";
}
mTvwriteout_cipher.setText(result);
} catch (Exception e) {
} finally {
if (cursor != null) {
cursor.close();
}
db.close();
}
}
5.將數(shù)據(jù)從sqlite轉(zhuǎn)移到sqlcipher
/**
* Created by callxkj on 16/10/11.
* 基本的sqlite數(shù)據(jù)庫
*/
public class NormalDBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "normal_database";
private static int DATABASE_VERSION = 1;
public NormalDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL.CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
/**
* 將數(shù)據(jù)從sqlite轉(zhuǎn)移到sqlcipher
*/
private void sqliteTOsqlcipher() {
NormalDBHelper mNormalDBHelper = new NormalDBHelper(this);
mNormaldb = mNormalDBHelper.getWritableDatabase();
//開啟事務(wù) 數(shù)據(jù)轉(zhuǎn)移成功了才能刪除舊sqlite中的數(shù)據(jù)
mNormaldb.beginTransaction();
Cursor cursor = null;
try {
cursor = mNormaldb.rawQuery("select * from " + SQL.MY_TABLE, null);
if (cursor.moveToNext()) {
Log.d(TAG, "還沒轉(zhuǎn)移");
cursor.close();
toMove(mNormaldb);
} else {
cursor.close();
Log.d(TAG, "已經(jīng)轉(zhuǎn)移了");
}
} catch (Exception e) {
Log.d(TAG, e.toString());
} finally {
mNormaldb.endTransaction();
if (mNormaldb != null) {
mNormaldb.close();
}
}
}
/**
* 轉(zhuǎn)移sqlite的數(shù)據(jù)到chipher數(shù)據(jù)庫
*
* @param db sqlite
*/
private void toMove(SQLiteDatabase db) {
Cursor cursor = null;
Cursor cipherCursor = null;
net.sqlcipher.database.SQLiteDatabase cipherDB = null;
try {
ArrayList<SQLbean> sqLbeanlist = new ArrayList<>();
cursor = db.rawQuery("select * from " + SQL.MY_TABLE, null);
while (cursor.moveToNext()) {
String userid = cursor.getString(cursor.getColumnIndex(SQL.USERID));
String value = cursor.getString(cursor.getColumnIndex(SQL.VALUE));
SQLbean bean = new SQLbean();
bean.userid = userid;
bean.value = value;
sqLbeanlist.add(bean);
}
db.delete(SQL.MY_TABLE, null, null);
DBCipherHelper dbHelper = new DBCipherHelper(this);
cipherDB = dbHelper.getWritableDatabase("secret_key");
for (int x = 0; x < sqLbeanlist.size(); x++) {
SQLbean sqLbean = sqLbeanlist.get(x);
//判斷數(shù)據(jù)是否有重復(fù)同步
cipherCursor = cipherDB.rawQuery("select * from " + SQL.MY_TABLE
+ " where " + SQL.USERID + " = ? and " + SQL.VALUE + " = ?"
, new String[]{sqLbean.userid, sqLbean.value});
if (cipherCursor.moveToNext()) {
//說明數(shù)據(jù)已經(jīng)轉(zhuǎn)移過來了 不做處理
} else {
ContentValues cv = new ContentValues();
cv.put(SQL.USERID, sqLbean.userid);
cv.put(SQL.VALUE, sqLbean.value);
cipherDB.insert(SQL.MY_TABLE, null, cv);
}
}
// db.execSQL("drop table "+SQL.MY_TABLE);//刪除表
db.setTransactionSuccessful();
} catch (Exception e) {
} finally {
if (cursor != null) {
cursor.close();
}
if (cipherDB != null) {
cipherDB.close();
}
}
}
三 驗(yàn)證結(jié)果

Paste_Image.png

Paste_Image.png