• 接入方法
  • 使用 WCDB 其他功能

    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();