对象/关系映射(ORM)
greenDAO的本质是为存储在关系数据库SQLite中的数据提供面向对象的接口。只需定义数据模型,greenDAO将创建Java数据对象(实体)和DAO(数据访问对象)。这将为您节省很多无聊的代码,只是来回移动数据。除此之外,greenDAO还提供一些高级ORM功能,如会话缓存,预先加载和活动实体。
性能
在我们所知的所有ORM中,greenDAO是最快的。greenDAO不会对性能做任何妥协。数据库经常用来存储大量数据,因此速度很重要。使用greenDAO,大多数实体可以以每秒几千个实体的速率插入,更新和加载。
下面是GreenDao 做的和OrmLite已经ActiveAndroid的速度对比,由图可知GreenDao的熟读确实很快,尤其是读取熟读
![](https://i-blog.csdnimg.cn/blog_migrate/31fa87c2fd830c114777b0b9377b16aa.png)
加密支持
您可以将greenDAO与嵌入Android的标准SQLite一起使用,也可以将其与SQLCipher一起使用。
虽然Android的新版本支持文件系统加密,但Android本身不提供数据库文件的加密功能。因此,如果攻击者获得对数据库文件的访问权(通过获取root访问权,例如利用安全漏洞或欺骗root设备的用户),攻击者可以访问该数据库内的所有数据。使用受密码保护的加密数据库会增加一层额外的安全性。它可以防止攻击者简单地打开数据库文件。
由于Android不支持现成的加密数据库,因此需要在APK中捆绑自定义版本的SQLite。这些自定义构建由CPU相关的本地代码组成。所以APK的大小会增加几MB。因此,如果你真的需要它,你应该只使用加密。
虽然Android的新版本支持文件系统加密,但Android本身不提供数据库文件的加密功能。因此,如果攻击者获得对数据库文件的访问权(通过获取root访问权,例如利用安全漏洞或欺骗root设备的用户),攻击者可以访问该数据库内的所有数据。使用受密码保护的加密数据库会增加一层额外的安全性。它可以防止攻击者简单地打开数据库文件
使用自定义SQLite构建
由于Android不支持开箱即用的加密数据库,因此您需要在APK中捆绑自定义版本的SQLite。这些自定义构建由CPU相关的本地代码组成。所以你的APK的大小会增加几MB。因此,如果你真的需要它,你应该只使用加密。
设置数据库加密
greenDAO 直接支持带有绑定的SQLCipher。SQLCipher是使用256位AES加密的SQLite定制版本。
添加SQLCipher依赖关系
有关如何将SQLCipher添加到项目的信息,请参阅Android的SQLCipher页面。
数据库初始化
确保使用DaoMaster中提供 的OpenHelper的子类 来创建数据库实例。例如DaoMaster中也提供 了简单的DevOpenHelper。
然后,在创建数据库实例时,只需调用 。getEncryptedWritableDb (< password > )而不是 。getWritableDb()。最后,像往常一样将数据库传递给 DaoMaster:
1
2
3
|
DevOpenHelper
helper
=
new
DevOpenHelper
(
this
,
"notes-db-encrypted.db"
)
;
Database
db
=
helper
.
getEncryptedWritableDb
(
"<your-secret-password>"
)
;
daoSession
=
new
DaoMaster
(
db
)
.
newSession
(
)
;
|
数据库抽象
greenDAO为所有数据库交互使用一个精简抽象层,因此支持标准和非标准SQLite实现:
- Android标准的android.database.sqlite.SQLiteDatabase
- SQLCipher的 net.sqlcipher.database.SQLiteDatabase
- 任何SQLite兼容的数据库,它可以实现 org.greenrobot.greendao.database.Database (例如SQLite的自定义构建)
这使您可以轻松地从标准数据库切换到加密的数据库,因为您的代码在定位DaoSession和单个DAO 时是相同的 。
用Robolectric进行单元测试
数据库抽象允许Robolectric进行单元测试。即使您的应用使用加密数据库,您的测试也可以使用未加密的数据库。
Robolectric实现标准的SQLite API,无法加载自定义SQLite构建(Android二进制文件)。所以对于你的测试,在创建数据库实例时使用 .getWritableDb() 而不是.getEncryptedWritableDb(<password>)。
已知的SQLCipher问题
SQLCipher是SQLite的自定义版本。其Android API与Android系统API差别不大。以下是我们注意到的问题(与greenDAO无关):
- 抛出的异常不属于 android.database.SQLException
- QLCipher锁定远远超过最近的 SQLiteDatabase实现。这不仅会降低并发性,还会增加死锁的可能性。
- 从SQLCipher 3.5.0开始缺少Android排序规则(如LOCALIZED)
苗条图书馆
greenDAO的核心库的大小不到100k,因此添加greenDAO并不会损害您的APK大小。
活动实体
如果你愿意,实体可以变为“活动”:活动实体透明地解析关系(你只需调用一个getter),并且拥有更新,删除和刷新方法,以方便访问持久性功能。
协议缓冲区支持
greenDAO可让您将协议缓冲区(protobuf)对象直接保存到数据库中。如果您通过protobuf与您的服务器通话,则不需要其他映射。常规实体的所有持久性操作都可用于protobuf对象。我们相信这是greenDAO的独特功能。
代码生成
greenDAO将生成Java数据对象(实体)和DAO对象。DAO对象是针对允许最佳映射的实体定制的。
未来计划:生成适配器,也许还有CRUD活动。
开源
greenDAO的源代码在G itHub上完全可用。源代码发行版还包含一个JUnit测试套件,它使用了greenDAO的所有功能,因此是学习greenDAO的好方法。
支持
greenDAO是开源的,并支持其开发者和其社区。