接入與遷移
接入 WCDB
Android 專案接入 WCDB,可以選擇通過 Maven 接入或通過 AAR 包接入。
通過 Maven 接入
對於大部分開發者,推薦使用 Maven 接入 WCDB,在 APP 模組的 build.gradle 下新增 WCDB 依賴即可
dependencies {
// 修改"1.0.0"為實際引用的版本
compile 'com.tencent.wcdb:wcdb-android:1.0.0'
}複製程式碼
通過 AAR 包接入
你也可以從釋出頁面下載 AAR 包,然後匯入到工程來接入 WCDB。
在 Android Studio 選擇 File -> New -> New Module... -> Import JAR/AAR Package
在 File -> Project Structure... 或編輯 APP 模組的 build.gradle 將 WCDB 加入依賴項:
dependencies {compile project(':wcdb')複製程式碼
}
選擇接入的 CPU 架構
WCDB 包含 armeabi, armeabi-v7a, arm64-v8a, x86 四種架構的動態庫,如果你的應用希望只接入 其中一種或幾種架構,可以在 APP 模組的 build.gradle 里加入以下程式碼來選擇要接入的架構:
android { defaultConfig { ndk { // 只接入 armeabi-v7a 和 x86 架構 abiFilters 'armeabi-v7a', 'x86' } } }複製程式碼
遷移到 WCDB
WCDB Android 使用與 Android SDK SQLite 框架幾乎一樣的介面
如果你的 APP 之前使用 Android SDK 的資料庫介面,只需要將 import 裡的 android.database. 改為 com.tencent.wcdb.,以及 android.database.sqlite. 改為 com.tencent.wcdb.database. 即可。
若之前使用 SQLCipher Android Binding,也需要對應修改 import。
加密與非加密資料庫差異只有開啟時,開啟後後續操作與 Android SDK 一致。具體請參考 WCDB API 文件。
從非加密資料庫遷移到加密資料庫
如果你之前使用的是非加密資料庫,接入後想遷移到加密資料庫並保留原來的資料,你需要使用 SQL 函式 sqlcipher_export() 進行遷移。
詳情請見 sample-encryptdb 示例,它示範瞭如何使用 SQLiteOpenHelper 實現資料從非加密往加密遷移和 Schema 升級。
注意: WCDB 對 sqlcipher_export() 函式做了擴充套件,原本只接受一個引數為匯出到哪個 ATTACHED DB, 現在可以接受第二個引數指定從哪個 DB 匯出。因此可以反過來實現匯入:
ATTACH 'old_database' AS old;
SELECT sqlcipher_export('main', 'old'); -- 從 'old' 匯入到 'main'
DETACH old;複製程式碼
從 SQLCipher Android 遷移
如果你之前使用的是 SQLCipher 資料庫,希望遷移到 WCDB 庫並沿用原資料庫檔案,需要在程式碼裡做一點改動。
String passphrase = "passphrase";
SQLiteCipherSpec cipher = new SQLiteCipherSpec() // 加密描述物件
.setPageSize(1024) // SQLCipher 預設 Page size 為 1024
.setSQLCipherVersion(3); // 1,2,3 分別對應 1.x, 2.x, 3.x 建立的 SQLCipher 資料庫
// 如以前使用過其他PRAGMA,可新增其他選項
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(
"path/to/database", // DB 路徑
passphrase.getBytes(), // WCDB 密碼引數型別為 byte[]
cipher, // 上面建立的加密描述物件
null, // CursorFactory
null // DatabaseErrorHandler
// SQLiteDatabaseHook 引數去掉了,在cipher裡指定引數可達到同樣目的
);複製程式碼
關鍵改動點為 密碼轉換為byte[] 以及 傳入SQLiteCipherSpec描述加密方式, 加密方式必須和之前的 SQLCipher 設定一致,否則會報錯誤,建議先行測試再上線。
SQLCipher 密碼與加密方式錯誤可能會導致 SQLite 框架認為其損壞從而觸發 DatabaseErrorHandler, 預設實現會重新命名或刪除損壞 DB,如果此行為不是你希望的,請務必自定義 DatabaseErrorHandler。
注意如果之前呼叫了 SQLCipher 的 SQLiteDatabase.loadLibs(...),可以將其刪去,WCDB 在第一次引用時會自動載入動態庫。
相信自己,沒有做不到的,只有想不到的
如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :232203809
微信公眾號:終端研發部
(這裡 學到的不僅僅是技術)