Android WCDB 现在已经正式介入 Room 以提供 ORM 以及数据绑定的功能,并能与 Android Jetpack 其他组件互动。

开始之前,最好先了解一下 Room 以及 LiveData 等组件,在 Room介绍页 里有两个详尽教程。

接入方法

  • 在接入 Room 的基础上,gradle 里加上 WCDB 的 room 组件
  1. dependencies {
  2. implementation 'com.tencent.wcdb:room:1.0.8' // 代替 room-runtime,同时也不需要再引用 wcdb-android
  3. annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' // compiler 需要用 room 的
  4. }
  • 代码里面,打开 RoomDatabase 时,指定 WCDBOpenHelperFactory 作为 openFactory
  1. SQLiteCipherSpec cipherSpec = new SQLiteCipherSpec() // 指定加密方式,使用默认加密可以省略
  2. .setPageSize(4096)
  3. .setKDFIteration(64000);
  4.  
  5. WCDBOpenHelperFactory factory = new WCDBOpenHelperFactory()
  6. .passphrase("passphrase".getBytes()) // 指定加密DB密钥,非加密DB去掉此行
  7. .cipherSpec(cipherSpec) // 指定加密方式,使用默认加密可以省略
  8. .writeAheadLoggingEnabled(true) // 打开WAL以及读写并发,可以省略让Room决定是否要打开
  9. .asyncCheckpointEnabled(true); // 打开异步Checkpoint优化,不需要可以省略
  10.  
  11. AppDatabase db = Room.databaseBuilder(this, AppDatabase.class, "app-db")
  12. //.allowMainThreadQueries() // 允许主线程执行DB操作,一般不推荐
  13. .openHelperFactory(factory) // 重要:使用WCDB打开Room
  14. .build();

其他使用与 Room 一样,请参考 Google 文档。另外可以参考 sample-persistence 查看最基本的接入,或者 sample-room-with-a-view 查看如何使用 Room + LiveData 进行数据绑定。Google 也有 教程 手把手指导使用 Room + LiveData

使用 WCDB 其他功能

Room 使用了 SupportSQLiteDatabase 接口来提供底层操作的抽象,Room 所有相关的 API 返回的都是 SupportSQLiteDatabase 接口,如需要使用 WCDB 其他功能(比如 Repair)一般需要 SQLiteDatabase 接口,可以通过下面的方式取得。

  1. // MyDatabase 为生成的 RoomDatabase
  2. MyDatabase db = Room.databaseBuilder(...)
  3. .openHelperFactory(new WCDBOpenHelperFactory(...))
  4. .build();
  5.  
  6. // 用这个方法获取 SQLiteDatabase 接口
  7. SQLiteDatabase sqlite = ((WCDBDatabase)db.getOpenHelper().getWritableDatabase()).getInnerDatabase();
  8.  
  9. // 使用 sqlite

或者在初始化时设置 callback

  1. MyDatabase db = Room.databaseBuilder(...)
  2. .openHelperFactory(new WCDBOpenHelperFactory(...))
  3.  
  4. // 添加初始化回调接口
  5. .addCallback(new RoomDatabase.Callback() {
  6. @Override
  7. public void onCreate(@NonNull SupportSQLiteDatabase db) {
  8. // 从 SupportSQLiteDatabase 获取 SQLiteDatabase
  9. SQLiteDatabase sqlite = ((WCDBDatabase)db).getInnerDatabase();
  10.  
  11. // 做其他事
  12. }
  13. })
  14.  
  15. .build();