Android 中主流数据库分析及应用

本文对比分析了Android中主流的数据库greenDao、ObjectBox和Room,包括性能、包体积、维护性、扩展性和学习成本。ObjectBox因性能优势被greenDao官方推荐,Room则在Google Jetpack家族中,提供了编译时检查和LiveData支持。文章详细介绍了ObjectBox的引入、使用及数据库升级,并展示了Room的使用方法和数据库升级策略。
摘要由CSDN通过智能技术生成

背景:

  • 公司目前一直用 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.常见优秀数据库的对比

  • 性能对比

    • 在内存大小相同的情况下处理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
 
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值