WCDB
中文版本请参看这里
WCDB 是一个用于微信应用的强大、完整、易用的移动数据库框架,目前在 iOS、macOS 和 Android 上可用。
WCDB for iOS/macOS
特性
-
易用。通过 WCDB,您只需一行代码即可从数据库中获取对象。
-
WINQ(WCDB 语言集成查询):WINQ 是一种本地数据查询功能,可让开发者免于编写用于连接 SQL 查询字符串的粘合代码。
-
ORM(对象关系映射):WCDB 提供灵活、易用的 ORM,用于创建表、索引和约束,以及通过 ObjC 对象进行 CRUD 操作。
[database getObjectsOfClass:WCTSampleConvenient.class fromTable:tableName where:WCTSampleConvenient.intValue>=10 limit:20];
-
-
高效。通过框架层和 sqlcipher 源代码优化,WCDB 具有更高的性能。
- 多线程并发:WCDB 支持通过连接池进行并发读写访问。
- 批量写入性能测试。请参阅 我们的基准测试,获取更多基准数据。
-
完整.
- 加密支持:WCDB 支持通过 SQLCipher 进行数据库加密。
- 损坏恢复:WCDB 提供内置的修复工具,用于数据库损坏恢复。
- 防注入:WCDB 提供内置的 SQL 注入防护。
入门指南
入门必备条件
- 使用WCDB的App可支持:iOS 7或更高版本、macOS 10.9或更高版本。
- 需要Xcode 8.0或更高版本。
- 需要Objective-C++。
安装
- 通过CocoaPods
- 安装CocoaPods。
- 运行
pod repo update
以让CocoaPods了解最新的WCDB版本。 - 在Podfile中,为你的App目标添加
pod 'WCDB'
。 - 从命令行运行
pod install
。 - 使用CocoaPods生成的
.xcworkspace
文件来编辑你的项目。 - 在你的Objective-C++源文件顶部添加
#import <WCDB/WCDB.h>
并开始你的WCDB之旅。 - 由于WCDB是一个Objective-C++框架,对于你的项目中包含WCDB的文件,你应该将其扩展名从
.m
更改为.mm
。
- 通过Carthage
- 安装Carthage。
- 将
github "Tencent/WCDB"
添加到Cartfile。 - 运行
carthage update
。 - 将
WCDB.framework
从适当平台的目录拖到Xcode项目设置中链接二进制和库
部分。 - 在你的应用程序目标的
构建阶段
设置标签页上,点击"+"图标并选择新建Run Script阶段
。创建一个Run Script包含carthage copy-frameworks
并添加框架路径到输入文件
:$(SRCROOT)/Carthage/Build/iOS/WCDB.framework
或$(SRCROOT)/Carthage/Build/Mac/WCDB.framework
。 - 在你的Objective-C++源文件顶部添加
#import <WCDB/WCDB.h>
并开始你的WCDB之旅。 - 由于WCDB是一个Objective-C++框架,对于你的项目中包含WCDB的文件,你应该将其扩展名从
.m
更改为.mm
。
- 通过动态框架:注意动态框架与iOS 7不兼容。有关iOS 7的支持,请参阅“静态框架”。
- 从git仓库获取源代码并更新sqlcipher子模块。
git clone https://github.com/Tencent/wcdb.git
cd wcdb
git submodule update --init sqlcipher
- 将
WCDB.xcodeproj
拖到你的项目中的wcdb/apple/
。 - 将
WCDB.framework
添加到Xcode项目通用设置
中的嵌入的二进制
部分。注意这里有两个框架,应该选择动态框架。你可以在构建阶段
->目标依赖
中检查它。正确的是WCDB
,而`WCDB iOS Static`用于静态库。 - 在你的Objective-C++源文件顶部添加
#import <WCDB/WCDB.h>
并开始你的WCDB之旅。 - 由于WCDB是一个Objective-C++框架,对于你的项目中包含WCDB的文件,你应该将其扩展名从
.m
更改为.mm
。
- 从git仓库获取源代码并更新sqlcipher子模块。
- 通过静态框架
- 从git仓库获取源代码并更新sqlcipher子模块。
git clone https://github.com/Tencent/wcdb.git
cd wcdb
git submodule update --init sqlcipher
- 将
WCDB.xcodeproj
拖到你的项目中的wcdb/apple/
。 - 将
WCDB iOS Static
添加到Xcode项目构建阶段
设置中的目标依赖
部分。 - 将
WCDB.framework
和libz.tbd
添加到Xcode项目设置中构建阶段
的链接的二进制和库
部分。请注意,存在两个WCDB.framework
,您应选择来自WCDB iOS静态
目标的那个。 - 将
-all_load
和-ObjC
添加到Xcode项目设置中其他链接器标志
部分。 - 在你的Objective-C++源文件顶部添加
#import <WCDB/WCDB.h>
并开始你的WCDB之旅。 - 由于WCDB是一个Objective-C++框架,对于你的项目中包含WCDB的文件,你应该将其扩展名从
.m
更改为.mm
。
- 从git仓库获取源代码并更新sqlcipher子模块。
教程
教程可以在这里找到。
文档
Android版WCDB
特性
- 数据库加密通过SQLCipher实现。
- 通过Android Architecture Components中的Room提供ORM/持久化解决方案。
- 通过现代Android框架的连接池实现并发访问。
- 数据库损坏恢复的修复工具。
- 针对小型备份尺寸优化的数据库备份和恢复实用工具。
- 日志重定向和各种追踪设施。
- 支持API 14(Android 4.0)及以上版本。
入门
要将WCDB包含到项目中,可以选择以下任一方式:通过Maven导入或通过AAR包导入。
通过 Maven 导入
要将 WCDB 通过 Maven 仓库导入,请将以下行添加到您的应用模块中的 build.gradle
文件
dependencies {
compile 'com.tencent.wcdb:wcdb-android:1.0.8'
// Replace "1.0.8" to any available version.
}
这将在构建应用程序时导致 Gradle 从 JCenter 下载 AAR 包。
如果您想使用 Room 持久化库,则需要将 Google Maven 仓库添加到您的 根项目 的 build.gradle
中。
allprojects {
repositories {
jcenter()
google() // Add this line
}
}
同样,也要在模块 build.gradle
中添加依赖项。
dependencies {
compile 'com.tencent.wcdb:room:1.0.8'
// Replace "1.0.8" to any available version.
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
// Don't forget to include Room annotation compiler from Google.
}
导入预构建的 AAR 包
1. 从发布页面下载 AAR 包。 2. 将 AAR 作为新模块导入。 在 Android Studio 中,选择“文件 -> 新建 -> 新模块...”菜单并选择“导入 JAR/AAR 包”。 3. 在新的模块中添加依赖项。 这可以通过在 Android Studio 中使用“文件 -> 项目结构...”来实现,或者通过向应用程序的 build.gradle
文件中添加以下代码来执行。
dependencies {
// Change "wcdb" to the actual module name specified in step 2.
compile project(':wcdb')
}
从纯文本 SQLite 数据库迁移
WCDB 提供了与 Android SQLite 数据库 API 非常相似的接口。要从 AOSP API 迁移您的应用,请将导入路径从 android.database.*
更改为 com.tencent.wcdb.*
,并将 android.database.sqlite.*
更改为 com.tencent.wcdb.database.*
。在更新导入路径后,您的应用将链接到 WCDB 而不是 AOSP API。
要打开或创建加密数据库,请使用带有-password 的版本 SQLiteDatabase.openOrCreateDatabase()
、SQLiteOpenHelper.getWritableDatabase()
或 Context.openOrCreateDatabase()
。
注意:WCDB 在 SQLCipher Android 绑定中使用 byte[]
而不是 String
作为密码。
String password = "MyPassword";
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("/path/to/database", password.getBytes(),
null, null);
见 sample-encryptdb
,用于在纯文本和加密数据库之间传输数据的示例。
与 Room 一起使用 WCDB
要使用 Room 库与 WCDB 一起使用,请按照 Room 指令 进行操作。唯一需要更改的代码是在获取数据库实例时指定 WCDBOpenHelperFactory
。
SQLiteCipherSpec cipherSpec = new SQLiteCipherSpec()
.setPageSize(4096)
.setKDFIteration(64000);
WCDBOpenHelperFactory factory = new WCDBOpenHelperFactory()
.passphrase("passphrase".getBytes()) // passphrase to the database, remove this line for plain-text
.cipherSpec(cipherSpec) // cipher to use, remove for default settings
.writeAheadLoggingEnabled(true) // enable WAL mode, remove if not needed
.asyncCheckpointEnabled(true); // enable asynchronous checkpoint, remove if not needed
AppDatabase db = Room.databaseBuilder(this, AppDatabase.class, "app-db")
.allowMainThreadQueries()
.openHelperFactory(factory) // specify WCDBOpenHelperFactory when opening database
.build();
见 sample-persistence
,了解使用 Room 库和 WCDB 的示例。见 sample-room-with-a-view
,了解使用 Room 库和 Google 的其他架构组件与 WCDB 一起使用的示例。
sample-room-with-a-view
来自Google的CodeLabs,经过少数几行的修改。搜索[WCDB]关键字以查找修改内容。查看原始教程请点击此处。
数据恢复
有关使用RepairKit
恢复损坏数据库的说明,请参阅sample-repairdb
。
重定向日志输出
默认情况下,WCDB将其日志消息打印到系统日志。您可能希望更改此行为,例如,为了保存日志方便故障排除。WCDB可以使用Log.setLogger(LogCallback)
方法将所有日志输出重定向到用户定义的例程。
从源码构建
使用预构建依赖项构建WCDB Android
除了它的依赖项之外,WCDB本身可以使用Gradle或Android Studio进行构建。要构建WCDB Android库,请在android
目录下运行Gradle。
$ cd android
$ ./gradlew build
构建WCDB需要已安装的Android NDK。如果Gradle未能找到您的SDK和/或NDK,您可能需要在android
目录下创建一个名为local.properties
的文件,其内容如下:
sdk.dir=path/to/sdk
ndk.dir=path/to/ndk
当项目导入到Android Studio时,它将为您完成此操作。
从源代码构建依赖项
WCDB依赖于OpenSSL加密库和SQLCipher。如果您想重构所有依赖项,则需要主机系统上安装一个 trabajar C 编译器、Perl 5、Tcl 和 bash 环境。
为了构建依赖,检出所有子模块,设置ANDROID_NDK_ROOT
环境变量为你的NDK路径,然后运行build-depends-android.sh
$ export ANDROID_NDK_ROOT=/path/to/ndk
$ ./build-depends-android.sh
这将构建OpenSSL加密库,并生成SQLCipher混合源代码,并将其放置在适合WCDB库构建的适当位置。
文档
贡献
如果你有兴趣贡献,查看[CONTRIBUTING.md],也可以加入我们的腾讯开源计划。