zoukankan      html  css  js  c++  java
  • Android 对象型数据库 db4o

    你有木有烦恼过数据库的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 <T>
    * @param obj
    * @return
    *
    * @return ArrayList<T> 
    */ 
    @SuppressWarnings("unchecked")
    public <T> ArrayList<T> queryConstrain(T obj){
    return new ArrayList<T>((ObjectSet<T>) db().queryByExample(obj));
    }
    查询方式2:SODA(Simple Object Database Access)
    @SuppressWarnings("unchecked")
    public <T> ArrayList<T> 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<T>((ObjectSet<T>)query.execute());
    }
    查询方式3:NQ(Native Queries)
    @SuppressWarnings("unchecked")
    public <T> ArrayList<T> queryLimit(T obj, int page, int count) {
    ArrayList<T> list = new ArrayList<T>((ObjectSet<T>)db().query(new Predicate(obj.getClass()) {
    @Override
    public boolean match(Object arg0) {
    return true;
    }
    }));
    if (list.size() > count * page) {
    return new ArrayList<T>(list.subList(page * count, (list.size() - count * (page + 1) >= 0 ? count
    * (page + 1) : list.size())));
    } else {
    return new ArrayList<T>();
    }
    }
    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 <T>
    * @param obj entity
    * @return
    *
    * @return boolean 
    */ 
    public <T> 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 <T>
    * @param obj
    * @return
    *
    * @return boolean 
    */ 
    public <T> 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 官方基准测试数据
      图2. db4o 官方基准测试数据 

    • 易嵌入。使用 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测试。大家可以自己测试看看,有问题的可以一起讨论。
     
  • 相关阅读:
    HDU 5044 Tree 树链剖分
    HDU 3966 Aragorn's Story 动态树 树链剖分
    HDU 2475 BOX 动态树 Link-Cut Tree
    上阶段总结
    HDU 3487 Play with Chain | Splay
    HDU 3726 Graph and Queries 平衡树+前向星+并查集+离线操作+逆向思维 数据结构大综合题
    VIJOS P1081 野生动物园 SBT、划分树模板
    VIJOS P1647 不差钱 SBT
    HDU 1890 Robotic Sort | Splay
    基础练习(VIP部分-持续更新)
  • 原文地址:https://www.cnblogs.com/stay/p/2363297.html
Copyright © 2011-2022 走看看