当前位置: 首页 > news >正文

Android开发-面向对象的数据库Db4o

领先的开源面向对象数据库提供厂商db4objects宣布db4o已可以顺利运行于Android平台。先前的InfoQ新闻“Db4Objects发布Db4o 7.0,支持透明激活”中曾经报道db4objects公司和爱好者积极推进db4o运行于Google Android平台,以期待让db4o成为Android上的首选数据库平台,现在db4o已经成功走出了这一步。

Android是Google宣布成立的“开放手机联盟”的移动开发平台。开发者拿到的Andorid SDK是一个包含完整的移动设备开发工具包,包括应用程序框架、开发环境和工具(基于Eclipse)、调试和虚拟运行环境,默认的开发语言是Java,让开发者可以使用熟悉的面向对象方式开发移平台动应用程序。Andorid平台的操作系统使用Linux内核,其上架设了基于C/C++编写的OpenGL、字体、编解码器、SQLite和用于Web渲染的Webkit。更多细节,可以回顾新闻“Google Android SDK舍弃Java ME,支持Java Lite和Apache Harmony”。在这个SDK发布之后,其Dalvik虚拟机背离标准Java虚拟机的基于寄存器的实现,而且配合使用了Apache的Harmony基础类库,这种选择说明了Google实现开放联盟的决心,虽然引发了是否会造成Java移动开发平台的分裂的争议,但是从长远的角度讲开放平台能够拥有更高的市场占有率。

db4o是一个被广泛欢迎的面向对象数据库,起初它基于Java平台,而后发布了.Net平台的版本,db4o具有双授权(GPLv2和商业授权),所以在很多开源项目中都可以看到db4o的身影。面向对象数据库的出现是为了更好的适合面向对象方式开发应用程序,因为传统的关系型数据库与OO模型具有“阻抗不匹配”问题,目前广被接受的方案是使用ORM(对象关系映射)框架来解决。但是Java中的Hibernate、基于标准的JPA、轻量级iBatis或.Net下的NHibernate都无法解决复杂度问题,且ORM框架中广泛使用的动态增强方式在资源受限环境下的性能开销(Dalvik不使用堆实现VM的其中一个原因就是性能优化的考虑)很难被接受,所以在Android发布时选择了资源占用小内核简单的SQLite作为数据库引擎,但这意味着Android平台将默认使用关系模型数据库。db4objects这样评价了这个组合的遗憾之处:

然而,令人惊讶的是Android推出时依然使用了关系型数据库,它是与整个平台的面向对象风格所不和谐的唯一部分。幸运的是,db4objects有相应的解决方案。db4o可以无缝的运行于Android,使简单的实现原生对象存取成为可能。

虽然关系型数据库对于大多数开发者来说都非常熟悉,但是对于喜欢使用一致的OO模型进行持久化的程序员来说这就有些“困扰”了,因为前面所述在这种环境下选择ORM是不现实的。db4o拥有方便嵌入应用程序中的引擎,适合与应用程序共同分发,而且它具有轻量特性,运行文件只有600k左右。这些特性与SQLite相呼应,因为SQLite也是以容易嵌入、资源占用小见长的,db4o作为面向对象数据库在这些对应方面不会逊色,可以作为一个SQLite的很好的面向对象替代方案。db4o的新闻中这样描述了使用了像db4o这类面向对象数据库的好处:

使用像db4o这样的面向对象数据库有很多好处,包括代码更容易维护、可以基于更灵活的数据模型创建各种新颖的应用程序。不同于僵化的,预先定义的SQL表(table),db4o允许存储灵活、形式自由的数据,这些数据可以随时更改或修正。而且,db4o还允许通过dRS(db4o复制系统)高效的复制数据,这也是Android中一个缺失的环节。通过dRS,开发者可以编写应用程序让用户的数据备份到后台服务器或者家中的PC上。也就是说,一个用户可以在电话上开始玩一个游戏,然后暂停,晚上可以在家中继续玩。商业的应用场景包括基于地点的自动配置信息同步(field force automation),RFID的数据采集,和复杂导航系统的本地地理数据缓存。

db4o支持Android平台对于程序员来说就是提供了在移动平台使用面向对象API(创新的数据查询方式,使用原生查询可以语义化、类型安全的对数据进行查询)进行持久化和查询的工具,也补全了Android平台开发API中唯一不符合面向对象的模块(即SQLite对应的关系型数据库),对于“开放手机联盟”来说意味着更多的开源厂商开始向开放联盟靠拢。Db4Objects的新闻稿中这样描述了让db4o运行于Android平台的过程和一些相关的示例项目:

在下载了Android SDK后几分钟,db4objects的工程师就使db4o运行于Android上了。Android上的db4o通过了3,500个单元测试。现在db4o拥有达到设备级别(device-grade)的软件质量,在关键性场合得到了证明,它被部署于高速列车、飞行器、复印机等设备中,它也可以被部署于Android开发者的掌上设备中。

现在db4o刚刚宣布支持Android,所以可以参考的程序范例并不多。db4o的社区经理German Viscuso将PasswordSafe移植到db4o,它可能是第一个可以在Android下与db4o协同工作的软件包。而PasswordSafe的作者Steven Osborn也称赞说:“太棒了,db4o的代码比我的更优雅”。另外一个样例程序是MapMe,它可以在 Android上面显示2D地图,使用了db4o存储和查询Google地图的数据信息。

Ted Neward曾经多次提到过使用db4o带来的好处,InfoQ曾经在“借用对象数据库db4o简化开发过程”中描述过db4o在优化开发过程方面的优势,它能够更简单的适应持久化模型不断的变化,能够平滑的实现数据模型重构,所以在测试驱动开发中会带来实际的红利。对于db4o与Android都还处于观望态度的程序员可以借此机会一起尝试一下这个移动开发平台和面向对象数据库带来的新编程模型。

原文链接:http://www.infoq.com/cn/news/2007/12/db4o_as_android_ready

相关文章:

  • 实现千万级数据的分页显示
  • Linux 下 crontab 格式详解
  • UltraWebGrid根据单元格内容禁用checkbox列
  • Linux 指令篇:日期时间排程--crontab
  • liferay的contextpath问题
  • 与领导喝酒的18个应紧记的诀窍
  • Linux Samba - Peer/Peer Model
  • 用VB操纵DHTML(Document)对象
  • 向软件英雄致敬
  • 悟透JavaScript
  • Image 延迟加载 -- LazyLoad
  • 反其道而用之,把数组写入文件
  • 130个C#面试问题
  • PHP常用正则表达式汇总
  • 反其道而用之,把数组写入文件2
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • ES6 学习笔记(一)let,const和解构赋值
  • es的写入过程
  • js如何打印object对象
  • Linux下的乱码问题
  • ReactNative开发常用的三方模块
  • SegmentFault 2015 Top Rank
  • tensorflow学习笔记3——MNIST应用篇
  • webpack4 一点通
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 让你的分享飞起来——极光推出社会化分享组件
  • 设计模式走一遍---观察者模式
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 项目管理碎碎念系列之一:干系人管理
  • 字符串匹配基础上
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • #{}和${}的区别?
  • $jQuery 重写Alert样式方法
  • $refs 、$nextTic、动态组件、name的使用
  • (007)XHTML文档之标题——h1~h6
  • (10)ATF MMU转换表
  • (第二周)效能测试
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .htaccess配置重写url引擎
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Web项目创建比较不错的参考文章
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net快速开发框架源码分享
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • ??在JSP中,java和JavaScript如何交互?
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell