你有木有烦恼过数据库的crud,有木有对sql很烦躁,Android虽然有封装好的ContentProvider,但是操作还是有点复杂了。不是很喜欢。

这两天花时间整了下DB4O,确实很不错,不用建表,不用写sql,只要写好Entity就ok了,太方便了。

我把DB4O也封装了,常用的功能都满足,放对象进去就好了。如果有复杂查询可以自定义。

直接看代码吧。

初始化:
/**
* @Description: init
*
* @return
*
* @return ObjectContainer
*/
private ObjectContainer db() {
try {
if (oc == null || oc.ext().isClosed()) {
oc = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), path);
}
} catch (Exception e) {
Log.e(LOG, e.toString());
}
return oc;
}
查询方式1:QBE(Query by Example)
/**
* @Description: query by constrain,
* if you want to find by id
* first , new Entity .then obj.setId(id), call queryConstrain(obj)
* it will return suitable list
* @param
* @param obj
* @return
*
* @return ArrayList
*/
@SuppressWarnings("unchecked")
public ArrayList queryConstrain(T obj){
return new ArrayList((ObjectSet) db().queryByExample(obj));
}
查询方式2:SODA(Simple Object Database Access)
@SuppressWarnings("unchecked")
public ArrayList queryAllSortBy(T t,boolean isDesc,String sort){
Query query = db().query();
query.constrain(t);
if (isDesc) {
query.descend(sort).orderDescending();
}else {
query.descend(sort).orderAscending();
}
return new ArrayList((ObjectSet)query.execute());
}
查询方式3:NQ(Native Queries)
@SuppressWarnings("unchecked")
public ArrayList queryLimit(T obj, int page, int count) {
ArrayList list = new ArrayList((ObjectSet)db().query(new Predicate(obj.getClass()) {
@Override
public boolean match(Object arg0) {
return true;
}
}));
if (list.size() > count * page) {
return new ArrayList(list.subList(page * count, (list.size() - count * (page + 1) >= 0 ? count
* (page + 1) : list.size())));
} else {
return new ArrayList();
}
}
insert/update:
/**
* @Description: this method is suitable for insert & update db.
* if you want to update ,pls use the same obj cause db4o only identify same obj.
* so query the entity first ,then modify the value ,call save() to update
* @param
* @param obj entity
* @return
*
* @return boolean
*/
public boolean save(T obj) {
try {
db().store(obj);
db().commit();
return true;
} catch (Exception e) {
db().rollback();
e.printStackTrace();
return false;
}
}
delete:
/**
* @Description: if you want to delete ,pls use the same obj cause db4o only identify same obj.
* so query the entity first ,then call del() to delete db
*
* @param
* @param obj
* @return
*
* @return boolean
*/
public boolean del(T obj){
try {
db().delete(obj);
db().commit();
return true;
} catch (Exception e) {
db().rollback();
e.printStackTrace();
return false;
}
}

非常easy吧,不需要建表,只需要传对象就ok了。这就是对象型数据库的好处

db4o 的一个特点就是无需 DBA 的管理,占用资源很小,这很适合嵌入式应用以及 Cache 应用,

db4o 特性

db4o 的目标是提供一个功能强大的,适合嵌入的数据库引擎,可以工作在设备,移动产品,桌面以及服务器等各种平台。主要特性如下:

  • 开源模式。与其他 ODBMS 不同,db4o 为开源软件,通过开源社区的力量驱动开发 db4o 产品。
  • 原生数据库。db4o 是 100% 原生的面向对象数据库,直接使用编程语言来操作数据库。程序员无需进行 OR 映射来存储对象,大大节省了程序员在存储数据的开发时间。
  • 高性能。 图2为 db4o 官方公布的基准测试数据,db4o 比采用 Hibernate/MySQL 方案在某些测试线路上速度高出 44 倍之多!并且安装简单,仅仅需要 400Kb 左右的 .jar 或 .dll 库文件。在接下来的系列文章中,我们将只关注在 Java 平台的应用,但是实际上 db4o 毫无疑问会很好地在 .NET 平台工作。
    图2. db4o 官方基准测试数据
    Android 对象型数据库 db4o_第1张图片
  • 易嵌入。使用 db4o 仅需引入 400 多 k 的 jar 文件或是 dll 文件,内存消耗极小。
  • 零管理。使用 db4o 无需 DBA,实现零管理。
  • 支持多种平台。db4o 支持从 Java 1.1 到 Java 5.0,此外还支持 .NET 、 CompactFramework 、 Mono 等 .NET 平台,也可以运行在 CDC 、 PersonalProfile 、 Symbian 、 Savaje 以及 Zaurus 这种支持反射的 J2ME 方言环境中,还可以运行在 CLDC 、 MIDP 、 RIM/Blackberry 、 Palm OS 这种不支持反射的 J2ME 环境中。

大家有兴趣的可以看下IBM对DB4O的介绍:开源面向对象数据库 db4o 之旅

下面附上我的demo:http://stay4it.com/showtopic-30.aspx

没写Activity,写的Junit测试。大家可以自己测试看看,有问题的可以一起讨论。