背景:
- 公司目前一直用 greenDao,还算稳定,前几天看到 greenDao 官方推荐另一个全新的数据库框架 ObjectBox,按照官方的说法,它的运行速度是SQ以及其他同类软件的10倍
- 现在大多数公司都开始切换使用kotlin 语言,而greenDao 它其实是一个 Java数据库,对kotlin 并不是很友好
- Google 官方推出了Jetpack 全家桶,里面包含的 Room 数据库也是一个非常不错的数据库,且作为开发者,JetPack 是一个大方向,很有必要了解和学习。
本文讲对比分析目前主流的数据库的一些优缺点及介绍如何将各个数据库引入到项目中使用。分析对比主要从以下方面进行:
- 性能和速度
- 包体积
- 是否利于后期维护
- 功能的扩展性
- 学习成本
1.greenDao 的现状及存在的一些问题
-
介绍:greenDao 是 Android中一个开源的对象关系映射框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,完成 Java 对象的存储,更新,删除和查询。
-
特点:
-
最佳性能:(可能是Android最快的ORM,由智能代码生成驱动)
-
最小的内存消耗
-
小:库小于 150K,保持较低的构建时间,并避免65k 方法限制
-
数据库加密
-
强大而活跃的社区交流支持
-
-
官方:
-
基于当下,存在的不足
-
性能上来说,并不是最优的选择
-
官方基本已经停止维护,v3.3.0之后版本没有再更新过
-
相比kotlin,更适合于 Java 项目
-
数据库升级的不足和繁杂
-
2.常见开源优秀的数据库框架
-
ObjectBox :现在 greendao 官方强烈推荐的面向对象的数据库框架(superfast),能够嵌入到 Android、Linux、macOS 或 Windows 应用程序中。
-
Room:谷歌官方的数据库框架,基于sqlite 进行了封装,我们可以直接使用room 来进行数据库的访问。
-
Realm:完美替代SQLite,核心包含C++库,同时支持Android和Ios ,是专门为移动平台设计的NoSql 数据库。
-
其他(如litePal)
3.常见优秀数据库的对比
-
性能对比
-
在内存大小相同的情况下处理1000条数据所用时间:
-
在内存大小相同的情况下处理10k条数据所用时间
-
结论:从性能上来看,ObjectBox 完全优于Realm和greenDao以及Room,同时Room和greenDao差别不是很大。
-
包体积大小
-
objectBox: 引入前:3.2M,引入后9.1M,包体积约为5.9M (1~1.5m)
-
Room:引入前:3.2M,引入后5.4M,包体积约为2.2M。(不到1m)
-
greenDao:<150K
-
Realm:引入前 3.2M,引入后12.3M,包体积约为9.1M
-
-
方法数限制:
-
ObjectBox:1300
-
Room:300
-
Realm:2000
-
总结:如果追求速度和效率,明显选择ObjectBox,如果受限于app大小,方法数已经接近64k限制,也愿意处理SQL,可以考虑Room。
4. ObjectBox 的介绍
objectBox 是greenDao 官方推荐的一款基于nosql 的开源数据库框架,它比SQLite快得多并且易于使用,
4.1特性:
4.2 关于Nosql 和SQL的简单介绍和对比
-
概念:
-
SQL:关系型数据库,比如mysql,oracle和SQL Server
-
No SQL:泛指 非关系型数据库,比如后台常用的MongoDB,Redis
-
-
存储方式:
-
SQL:存在特定结构的表中,常以数据库表形式存储数据
-
NoSQL:更加灵活和可扩展,存储方式可以是JSON文档,哈希表或者其他方式。
-
-
特点:
-
sql :必须先定义好表和字段结构才能添加数据,Nosql 中数据可以在任何地方添加,不需要定义表。
-
在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的
-
4.3 项目中objectBox的引入及使用
4.3.1 添加依赖
- 应用程序 build.gradle文件(模块级)下配置
apply plugin: 'io.objectbox' // 引入插件
-
项目根 build.gradle (项目级别) 配置
4.3.2 新建实体类
/**
*
* 注解说明:
* 1.对象必须有一个long类型的ID(注解为@Id)。
* 当然也可以使用包装类java.lang.Long,但是我们不建议这么做,因为long在ObjectBox 中非常的高效
*
* 2 id 是对象的主键,默认情况下是由ObjectBox 自动管理的,也就是自增id。
* 如果我们想要手动管理id则添加@Id(assignable = true)。id的值不能为负数,如果超过long的最大值,objectbox 会报错;;当id等于0时objectbox会认为这是一个新的实体对象,因此会新增到数据库表中;
* 3.@Unique :将属性值标记为唯一
*
* 4.@Transient:表示该字段不会持久存储在数据库中
* 5.@Backlink:定义反向链接关系,该关系基于另一个反向关系
*6.@NotNull:指定该属性不为空
*
*/
@Entity
public class QRCodeBox {
private String SkinNo;
@Unique