db4o是一个纯对象的数据库,现支持java和.NET。07年的时候,db4objects宣布db4o已可以顺利运行于Android平台,当时db4objects公司和db4o的爱好者积极推进db4o运行于Google Android平台,以期待让db4o成为Android上的首选数据库平台,但令人遗憾的是google最后选择了sqlite作为作为android平台的数据库。但是没有关系,db4objects有相应的解决方案,db4o可以无缝的运行于Android。

相对于关系型数据库,db4o还显得很年轻。大家对关系型数据库的理念根深蒂固,所以一时很难理解对象型数据库的理论。现在的数据库课程也都是以关系型数据库为示例,对象型数据库都是作为一个新兴的数据库一笔带过。这也导致很多人缺乏对象型数据的理论知识。真的想用好db4o,对象型数据的理论知识是必不可少的。例如对象型数据是没有主键这个概念的,这会让大多数人难以适应。

db4o也发展了几年了,到现在好多人还不知道,网上的资料比较少,也是比较老的版本。现在主流的android应用也都是使用sqlite数据库,这肯定是有原因的。这倒不是性能上的问题。Db4o的速度不见得会比关系型数据库慢。其最大的问题在于理解数据对象的关系和操作。db4o没有看上去那么简单,说实在的,我现在好多东西还没搞明白。比如:

class A {int id;String name;List<B> list;
}

存储这种结构的对象,我一直搞不明白A和B的关联情况。对应一些大应用还是建议使用比较成熟的东西。Android平台上大家倒是可以一试,我也分享下自己的学习成果。现在db4o最新是8.x。稳定版本是7.x。本人以7.x演示。要说的是android平台需要的db4o的jar要1M多(8.x版的要1.4M左右,网上说的400k应该是很早的版本了,官网上找不到了)。db4o的官网下载地址http://community.versant.com/Downloads/db4o.aspx。对应android开发只需要核心jar包db4o-7.x-core-java5.jar。在下载的压缩包里还有一个db4o数据库的视图工具OME(ObjectManager Enterprise),这是一个eclipse插件,是一个离线的安装包。

Db4o的操作流程很简单:打开数据库文件,通过DAO读写数据,最后关闭数据库,支持事务和并发。

作为对象型数据库是不用写sql的,这点很爽。

对于db4o的基本操作不再多说,可以参考文章最后的参考链接。我做了一些封装,并使用泛型来减少Dao的创建。如果不使用本例的泛型的话,你需要对每个bean创建Dao,如UserDao、CacheDao。在关系型数据库中我们通过主键来识别一条记录,但是对象型数据库中没有记录,只有对象。db4o通过序列化java对象并存入文件,它识别是这个还是那个对象用的不是主键,而是UUID,这个UUID只有当一个对象被存入数据库中才会被分配到,未存入数据库的对象是没有UUID的,所以说我们并不能通过UUID来更新一条数据.那怎样更新一条数据?我们只能是先将这个对象查出来,然后修改内容再存入,或者查询到直接删除,然后存入新对象.

Db.java

package com.sljm.lfa.store;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.CommonConfiguration;
import com.db4o.config.EmbeddedConfiguration;
import com.db4o.query.Query;/*** @author SunnyCoffee* @date 2013-9-7* @version 1.0* @desc DB配置和操作接口*/
public class Db<T extends Serializable> {private Class<T> clazz;private String unique;private static ObjectContainer db;/*** 这里的unique是class里作为索引的属性* * @param clazz* @param unique*/public Db(Class<T> clazz, String unique) {this.clazz = clazz;this.unique = unique;}// 打开数据库private ObjectContainer getDb() {if (db == null || db.ext().isClosed()) {db = Db4oEmbedded.openFile(conf(), getDbPath());}return db;}private String getDbPath() {return "/mnt/sdcard/lfa.db4o";// 数据库文件的路径}// 数据库的参数配置. 数据库配置并没有存储到文件,每次打开数据库执行此方法进行配置private EmbeddedConfiguration conf() {EmbeddedConfiguration conf = Db4oEmbedded.newConfiguration();CommonConfiguration common = conf.common();if (unique != null) {common.objectClass(clazz).objectField(unique).indexed(true);}common.objectClass(clazz).cascadeOnUpdate(true);common.objectClass(clazz).cascadeOnActivate(true);return conf;}/*** 存储对象* * @param obj*/public void store(T obj) {if (obj == null) {return;}getDb().store(obj);}public void store(List<T> list) {if (list == null) {return;}for (T t : list) {getDb().store(t);}}/*** 删除对象* * @param obj*/public void delete(T obj) {if (obj == null) {return;}getDb().delete(obj);}public void delete(List<T> list) {if (list == null) {return;}for (T t : list) {getDb().delete(t);}}/*** 查询所有的某一对象* * @return*/public List<T> queryAll() {Query query = getDb().query();query.constrain(clazz);query.descend(unique).orderAscending();ObjectSet<T> set = query.execute();List<T> list = fromObjectSet(set);return list;}/*** 根据id查询一个对象* * @param field*            字段* @param id*            字段的值* @return*/public T queryById(Object id) {List<T> list = queryWhere(unique, id);if (list.size() == 0) {return null;}return list.get(0);}public List<T> queryWhere(String field, Object value) {Query query = getDb().query();query.constrain(clazz);query.descend(field).constrain(value);ObjectSet<T> set = query.execute();List<T> list = fromObjectSet(set);return list;}public void close() {getDb().commit();if (db != null) {db.close();db = null;}}private List<T> fromObjectSet(ObjectSet<T> set) {List<T> list = new ArrayList<T>();while (set.hasNext()) {list.add(set.next());}return list;}
}

db4o有3种查询方式,官方一直推荐NQ(Native Queries),也就是原生查询.首先它是类型安全的,其次查询支持本地语言。还有就是QBE(Query by Example)和SODA(Simple Object Database Access)。QBE没有用过,似乎没什么特点。SODA的是最低层的查询方式,速度快、灵活性高,不足之处就是非类型安全的。本例中因为有排序操作,考虑效率和易用性上使用了SODA。

DbApiImpl.java

package com.sljm.lfa.store;import java.util.List;import com.sljm.lfa.bean.Cache;/*** @author SunnyCoffee* @date 2013-10-22* @version 1.0* @desc 数据库接口实现类,查询使用SODA。 NQ查询更安全,考虑到效率和简单使用了SODA,*       如此一来必须使用字符串来表示字段,如果javaBean变动这里字段必须做调整*/
public class DbApiImpl implements DbApi {public Cache getCacheById(final String id) {Db<Cache> db = new Db<Cache>(Cache.class, "id");Cache cache = db.queryById(id);db.close();return cache;}public void updateCache(Cache cache) {Db<Cache> db = new Db<Cache>(Cache.class, "id");Cache c = db.queryById(cache.getId());db.delete(c);db.store(cache);db.close();}public void clearCache() {Db<Cache> db = new Db<Cache>(Cache.class, "id");List<Cache> list = db.queryAll();db.delete(list);db.close();}
}   

这里注意两点一个是Serializable接口,一个是空构造方法。

Cache.java

package com.sljm.lfa.bean;import java.io.Serializable;/*** @author SunnyCoffee* @create 2013-8-21* @version 1.0* @desc 缓存bean*/
public class Cache implements Serializable {/*** */private static final long serialVersionUID = 1L;private String id;private long lastModified;private long valid;private Object result;public Cache() {}// set and get
}

参考链接:

http://www.ibm.com/developerworks/cn/java/j-db4o/

http://www.db4o.com

android平台db4o使用示例相关推荐

  1. MVP在Android平台上的应用

    2019独角兽企业重金招聘Python工程师标准>>> MVP在Android平台上的应用 原文链接 : Introduction to Model-View-Presenter o ...

  2. Android平台开源项目

    本文收集了比较不错的Android开源项目,研究开源项目是对Android平台掌握的一个最佳的方式. 由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏.图像处理.时间显示.开始菜单 ...

  3. 【Android 应用开发】Android 图表绘制 achartengine 示例解析

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197 一. AChartEngine 简介 1. 项 ...

  4. LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]

    一.LK层: 首先,在LK中,有一个对log打印级别的控制文档,其路径一般为:vendor\mediatek\proprietary\bootable\bootloader\lk\include\de ...

  5. WCF完美搭建android平台服务之一

    由于android系统的特殊性,对于wcf的平台服务的搭建就带来特殊要求,在这两种平台应用上数据的通用性而讲,能实现其信息的传递,我们可以采用JSON/XML两种数据数据格式传递,在wcf服务的搭建的 ...

  6. cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...

    在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  7. OpenCASCADE:适用于 Android 的 OCCT AndroidQt 示例

    OpenCASCADE:适用于 Android 的 OCCT AndroidQt 示例 OpenCASCADE:适用于 Android 的 OCCT AndroidQt 示例 构建示例要求: 指定安卓 ...

  8. android sdk 封装html5,Android平台以WebView方式集成HTML5+SDK方法

    HTML5+ SDK 可以按照"独立应用"和"单页面"两种种方式进行集成,两种集成方式各有优点. 独立应用集成方式:即Widget集成方式,开发者在集成后可在需 ...

  9. Android 系统(91)---Android 平台调试

    Android 平台调试 注意:使用 adb 和 setprop 参数一起调试 Android 的某些方面.请注意,在 Android 操作系统的 O 版本之前,属性名称的长度上限为 32 个字符.也 ...

  10. android支持平台,Android 平台功能

    Android 平台功能Android Platform Features 12/11/2019 本文内容 开发 Xamarin.Forms 适用于 Android 的应用程序需要 Visual St ...

最新文章

  1. Comcast在美国境内遭遇大面积宕机和连接中断问题
  2. C++静态成员和静态成员函数
  3. jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate
  4. python时间处理模块有哪些_Python模块之时间处理
  5. 光纤收发器如何选择?
  6. 论文学习1-DeepPath: A Reinforcement Learning Method for Knowledge Graph Reasoning
  7. numpy 中对axis参数的理解
  8. 网络(6)-TCP/IP对拥塞控制、滑动窗口如何实现可靠性?
  9. 多线程 简单的实现案例
  10. Python迭代列表
  11. 实战HTML:登陆界面的实现
  12. Veeam backup job(3)
  13. 基于springboot+vue的智慧教室预约系统(前后端分离)
  14. 机器学习中的混淆矩阵,准确率,精确率,召回率,F1,ROC/AUC,AP/MAP
  15. 企业如何选择SSL证书?
  16. Viewpage+小圆点
  17. 连接腾讯云云服务器的mysql
  18. 乡镇特色产业发展情况调研报告
  19. 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
  20. 【十三】python面向对象之类和对象

热门文章

  1. 目标跟踪之MOSSE算法(C++版本配置及原理简介)
  2. 黑苹果EFI大全下载,拥有各种电脑机型配置!
  3. 史上最全Linux面试题(2020最新版)
  4. ASCll码字符对照表
  5. G502使用计算机配置,罗技G502鼠标驱动调试详解!实战《男友4》设置!
  6. 芒果数据库备份与还原
  7. 海美迪盒子android升级包,海美迪H5固件升级ROM系统刷机包下载_刷机教程
  8. 2021年5月12日17点49分 绿盟极光
  9. 简单的整人代码(你是猪,文章末附带文件)
  10. python selenium 刷课_基于Python和selenium的内蒙古继续教育网---刷课