Android WCDB 现在已经正式介入 Room 以提供 ORM 以及数据绑定的功能,并能与 Android Jetpack 其他组件互动。
开始之前,最好先了解一下 Room 以及 LiveData 等组件,在 Room介绍页 里有两个详尽教程。
接入方法
- 在接入 Room 的基础上,gradle 里加上 WCDB 的 room 组件
- dependencies {
- implementation 'com.tencent.wcdb:room:1.0.8' // 代替 room-runtime,同时也不需要再引用 wcdb-android
- annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' // compiler 需要用 room 的
- }
- 代码里面,打开
RoomDatabase
时,指定WCDBOpenHelperFactory
作为 openFactory
- SQLiteCipherSpec cipherSpec = new SQLiteCipherSpec() // 指定加密方式,使用默认加密可以省略
- .setPageSize(4096)
- .setKDFIteration(64000);
- WCDBOpenHelperFactory factory = new WCDBOpenHelperFactory()
- .passphrase("passphrase".getBytes()) // 指定加密DB密钥,非加密DB去掉此行
- .cipherSpec(cipherSpec) // 指定加密方式,使用默认加密可以省略
- .writeAheadLoggingEnabled(true) // 打开WAL以及读写并发,可以省略让Room决定是否要打开
- .asyncCheckpointEnabled(true); // 打开异步Checkpoint优化,不需要可以省略
- AppDatabase db = Room.databaseBuilder(this, AppDatabase.class, "app-db")
- //.allowMainThreadQueries() // 允许主线程执行DB操作,一般不推荐
- .openHelperFactory(factory) // 重要:使用WCDB打开Room
- .build();
其他使用与 Room 一样,请参考 Google 文档。另外可以参考 sample-persistence
查看最基本的接入,或者 sample-room-with-a-view
查看如何使用 Room + LiveData 进行数据绑定。Google 也有 教程 手把手指导使用 Room + LiveData
使用 WCDB 其他功能
Room 使用了 SupportSQLiteDatabase
接口来提供底层操作的抽象,Room 所有相关的 API 返回的都是 SupportSQLiteDatabase
接口,如需要使用 WCDB 其他功能(比如 Repair)一般需要 SQLiteDatabase
接口,可以通过下面的方式取得。
- // MyDatabase 为生成的 RoomDatabase
- MyDatabase db = Room.databaseBuilder(...)
- .openHelperFactory(new WCDBOpenHelperFactory(...))
- .build();
- // 用这个方法获取 SQLiteDatabase 接口
- SQLiteDatabase sqlite = ((WCDBDatabase)db.getOpenHelper().getWritableDatabase()).getInnerDatabase();
- // 使用 sqlite
或者在初始化时设置 callback
- MyDatabase db = Room.databaseBuilder(...)
- .openHelperFactory(new WCDBOpenHelperFactory(...))
- // 添加初始化回调接口
- .addCallback(new RoomDatabase.Callback() {
- @Override
- public void onCreate(@NonNull SupportSQLiteDatabase db) {
- // 从 SupportSQLiteDatabase 获取 SQLiteDatabase
- SQLiteDatabase sqlite = ((WCDBDatabase)db).getInnerDatabase();
- // 做其他事
- }
- })
- .build();