微信 WCDB for Android 的接入

codeGoogle發表於2017-07-27

接入與遷移

github.com/Tencent/wcd…

接入與遷移
接入與遷移

接入 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
    遷移到 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。

WCDB歡迎你
WCDB歡迎你

注意如果之前呼叫了 SQLCipher 的 SQLiteDatabase.loadLibs(...),可以將其刪去,WCDB 在第一次引用時會自動載入動態庫。

相信自己,沒有做不到的,只有想不到的

如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :232203809
微信公眾號:終端研發部

技術+職場
技術+職場

(這裡 學到的不僅僅是技術)

相關文章