ObjectBox

本文最后更新于:5 个月前

  1. 介绍:

    github地址

    官方首页

    文档

    好处:

    1. 速度快:

      无论是传统的 sqlite 还是 Google 推荐的 realm 和 room , 甚至作者之前的产品 GreeDao 在速度上非常有优势.

      比较

      比较2

      从图上可以看出除了在加载 100k 的大量数据的时候 ObjectBox 的速度慢于 Realm,在执行其他数据操作的时候 ObjectBox 的性能对其他两位都是近乎碾压式的存在

      官方说是世界上最快的嵌入式数据库!

      为了提供高性能的数据库;我们开发ObjectBox。经过测试,ObjectBox是世界上最快的嵌入式数据库。

    2. 是一个 NoSQL 第三方数据库(不是 ORM)

      ObjectBox 并不是一个典型 ORM,它是完全为对象构建的;所以它没有行,列和数据库。没有行,列和 SQL —— ObjectBox 是一个从零开始的对象数据仓库(没有 ORM,没有 SQLite)。

    3. 调试方便:

      // 详情见下面的全局配置示例
      AndroidObjectBrowser(boxStore).start(context.applicationContext)
      adb forward tcp:8090 tcp:8090

      在浏览器输入http://localhost:8090/index.html就可以在网页看到数据的内容了!

  2. 博客文章

    https://juejin.im/post/5b1c34fae51d4506ce34a56b

    https://juejin.im/post/5a0e7bdc6fb9a0451a75f38e

    https://www.jianshu.com/p/e9996296a982

    https://www.jianshu.com/p/e4ebaa433ae7

    https://zhuanlan.zhihu.com/p/31146878

  3. 项目例子:

    1. 代码地址:

      git@github.com:objectbox/objectbox-examples.git

    2. 心得体会

      此项目有很多 module 使用 android-app-kotlin 这一个 module 就好

      android-app-kotlin module 里面有两个类似的文件分别是 NoteActivity 和 ReactiveNoteActivity

      其区别是,前者使用对数据进行更改需要刷新页面的时候,是使用重新查找全部内容然后重新渲染,并且调用 notifyDataSetChanged()方法实现,其思想较简单.

      而 ReactiveNoteActivity 虽然也是重新查找数据并显示,但却是使用订阅观察者模式和多线程的方法,而和前者顺序顺序执行有所区别.

      我猜测可能是基于效率和方便复用的考量

      因为当用户增加文本的时候,会刷新全部数据,把最新的数据刷新上去,但是此时增加按钮应该是阻塞状态.(觉得这个想法有点牵强,不过也是因为这个比较简单的原因,如果是上传大文件或者是项目逻辑比较复杂的时候就应该很有用了)

      复用是为了方便,因为不需要再每次的 addNote() 方法里面顺序调用 updateNotes() 方法重新查找并将数据保存到内存的list里面,而是隐式调用这个方法,减少模板代码的书写.

  4. 注意事项

    1. 先编译项目否则会提示有的类找不到

    2. 必须要一个自增 ID 才行, 用注解 @Id 标识

    3. apply plugin: ‘io.objectbox’ 一定要添加到 dependencies 模块后面

    4. 但是,如果 put、find 这些方法全是同步的,对于大量数据的存和查都是耗时操作,如果直接写在主线程会阻塞主线程,尤其是 find 方法,而 ObjectBox 的 Reactive 封装显然没有 RxJava 那么强大,

    5. 尽量使用全局配置

      object ObjectBox {
          lateinit var boxStore: BoxStore
      
          private set
      
          fun init(context: Context) {
      
              boxStore = MyObjectBox.builder().androidContext(context.applicationContext).build()
      
              if (BuildConfig.DEBUG) {
      
                  val start = AndroidObjectBrowser(boxStore).start(context.applicationContext)
      
                  Log.d(App.TAG, "browser start status: $start)")
              }
          }
      }
    6. (手机路径)默认保存位置在 /data/data/包名/files/objectbox/data.mdb

    7. 设置查询个数

      Query.find(Long offset, Long limit)