当前位置: 首页 > 编程日记 > 正文

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测试。大家可以自己测试看看,有问题的可以一起讨论。

相关文章:

【FFmpeg】设置H264参数

0、fffmpeg源码编译时,何时需要连接libx264库? ffmpeg其自带H.264解码功能,但是要实现H.264编码时就需要链接编码库libx264 ubuntu16.04安装libx264的库: sudo apt install libx264-148 sudo apt install libx264-dev一、设置x264参数的接口 // 获取编码器 AVCodec *co…

TIOBE 5 月编程语言排行榜:Python、C++竞争白热化,Objective-C已沦为小众语言

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;日前&#xff0c;TIOBE 编程语言社区最新发布了 2019 年 5 月排行榜。和 4 月榜单相比&#xff0c;5 月编程语言排行榜的 Top 10 位置并没有太大变化。但是在 C 和 Python 激烈的竞争局势下&#xff0c;随…

Caused by: org.xml.sax.SAXParseException: 不允许有匹配 [xX][mM][lL] 的处理指令目标。

版权声明&#xff1a;本文为 testcs_dn(微wx笑) 原创文章&#xff0c;非商用自由转载-保持署名-注明出处&#xff0c;谢谢。 https://blog.csdn.net/testcs_dn/article/details/81001749 Caused by: org.xml.sax.SAXParseException: 不允许有匹配 "[xX][mM][lL]" 的处…

Centos 64位使用 yum 会安装两个相同软件包的解决方法

Centos 64位使用 yum 会安装两个相同软件包的解决方法 - 后山一根葱Centos 64位使用 yum 会安装两个相同软件包的解决方法[Linux]post by 后山一根葱 / 2011-6-24 1:43 Friday系统环境&#xff1a;Centos 5.6 X86_64事项&#xff1a;关于yum install 安装两个相同软件包问题今天…

php的基础知识(四)

14、数组&#xff1a; 索引数组&#xff1a; 下标就是数字开始的。 $arr [a,b,c,1,2,3]; 关联数组&#xff1a; $arr [ a > b, c > d; e > f ]; 二维数组&#xff1a; 关联和索引混合的。 $arr [ a, b, c, d > [ e > h, f, g ], i, ]; 三维数组和多维数组。 …

【Ubuntu】解决问题:tcp :8080: bind: address already in use

1、问题描述 在ubuntu中启动一个web程序时报错 tcp :8080: bind: address already in use2、原因查找 查找占用8080的服务&#xff1a;sudo netstat -tanlp 注意&#xff1a;不加sudo权限时&#xff0c;不显示PID和程序名字 $ sudo netstat -tanlp 激活Internet连接 (服务器…

ICLR 2019最佳论文揭晓!NLP深度学习、神经网络压缩夺魁 | 技术头条

整理 | Linstansy责编 | Jane出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;【导语】ICLR 是深度学习领域的顶级会议&#xff0c;素有深度学习顶会 “无冕之王” 之称。今年的 ICLR 大会将于5月6日到5月9日在美国新奥尔良市举行&#xff0c;大会采用 Ope…

浅析flex中的焦点focus

一、无焦点的困扰——组件监听不到键盘事件原因&#xff1a;只有获得焦点的组件&#xff08;确切说是InteractiveObject&#xff09;才能监听到键盘事件的目标阶段&#xff1b;键盘事件&#xff08;flash.events.KeyboardEvent&#xff09;参与冒泡阶段&#xff0c;所以焦点组件…

专访NIPS主席:如何保证论⽂评审的公平性?| 人物志

记者 | 阿司匹林编辑 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;作为人工智能领域顶会 NIPS&#xff08;Conference and Workshop on Neural Information Processing Systems&#xff0c; 更名为 NeurIPS&#xff09;的主席&#xff0c;Terrence Sejnowsk…

【H.265】H.265(HEVC)编码过程和名词解释

一、H.265(HEVC)编码过程 和H.264一样,H.265编码由帧内预测、帧间预测、量化、线性变换等步骤。过程大致如下; 1、分块 一帧画面首先被切分成多个互不重叠的块状区域,称为编码单元(H.264称为宏块),分别传输给编码器。 2、帧内预测 图像序列的第一个画面(以及每一个可…

为什么大家都推荐我学Linux

2019独角兽企业重金招聘Python工程师标准>>> 最近朋友总是推荐我去学Linux&#xff0c;我本人虽说是计算机专业的&#xff0c;但是我感觉在上学的时候好像还真没学到东西&#xff0c;现在也是干着一份与计算机半毛钱关系都没有的工作。朋友总是说Linux多好&#xff…

认识HTML5的WebSocket 认识HTML5的WebSocket

2019独角兽企业重金招聘Python工程师标准>>> 在HTML5规范中&#xff0c;我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术&#xff0c;以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法&#xff0c;从客户端…

空字符串计数、让字典可排序...Python冷知识(五)

本文转载自Python编程时光&#xff08;ID: Python-Time&#xff09;冷知识系列&#xff0c;直至今日&#xff0c;已经更新至第五篇。前四篇给你准备好了&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人…

后端说:只是你不懂怎么用 headers!

事情是这样的&#xff0c;上一个项目我们的后端提供的接口&#xff0c;一次性返回了所有数据给我&#xff0c;分页功能是前端自己完成的。 那么这次来的新项目&#xff0c;换了个后端&#xff0c;写了另外的接口&#xff0c;我做项目的时候&#xff0c;还是用的之前的前端分页组…

【H2645】H.264的宏块和H.265的编码树单元总结

一、H.264宏块 1、什么是宏块? 先看下面两张图,就能大体知道宏块指的是哪了。 将连续几帧图像分为一组(GOP)在H264中称为一个序列(sequence); 将每帧图像(Frame)划拉几道分成片(slice); 将每片(slice)按照16x16的大小横着竖着划拉成宏块(Maroblock); 将宏块(Maroblock…

android adb root方法

2019独角兽企业重金招聘Python工程师标准>>> 在有些android手机上使用adb root希望获取root权限时出现如下提示信息&#xff1a;adbd cannot run as root in production builds。此时提升root权限的方法是&#xff1a; 1。在android手机上获取超级用户权限&#xff…

10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

译者 | linstancy作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan编辑 | 蓝色琥珀鱼&#xff0c;Rachel出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】本文提出了一种十亿级数据规模的半监督图像分类模型&#xf…

【Qt】QtCreator导入cmake工程

QtCreator导入cmake 一、ubuntu系统1、配置cmake编译套件2、导入cmake工程二、windows系统1、下载cmake2、安装cmake3、设置环境变量4、添加cmake5、配置kit6、编译时配置7、cmake选项配置8、编译后,执行安装命令一、ubuntu系统 1、配置cmake编译套件 在QtCreator中依次点击…

腾讯音乐招 iOS 开发, base 深圳,要求:本科、三年、OC,懂音视频开发优先。...

计算机基础扎实&#xff0c;精通 Objective-C&#xff0c;熟悉 iOS 平台并有良好的软件开发经验&#xff1b; 熟悉 https 及流媒体上传下载协议&#xff0c;精通 TCP/IP 协议&#xff1b; 良好的编码风格&#xff0c;以及足够的调试技术和问题解决能力&#xff1b; 责任心强&am…

Android深入浅出系列之Android工具的使用—模拟器(一)

前言  我们下载的SDK包里面有一个叫“Tools”的文件夹&#xff0c;里面为我们提供了许多与Android开发相关的工具&#xff0c;其中一些是必不可少的&#xff0c;现在我们就介绍一下模拟器 Android模拟器的创建  使用“Android SDK and AVD Manager”可以很方便的创建一个An…

【H2645】帧内预测

1、帧内预测的原理 帧内预测的原理&#xff1a;预测值是该像素周围像素值加权求和(比如平均值)P&#xff0c;它和实际值相减后得到的差值q&#xff0c;如果差值q很小&#xff0c;说明该像素的值可以通过预测得出&#xff0c;可以丢弃了&#xff0c;这就达到压缩编码的目的。当…

程序员神级跳槽攻略:什么时候该跳?做什么准备?到哪里找工作?

为什么80%的码农都做不了架构师&#xff1f;>>> 1、引言 每年的3、4月份都是求职高峰时期&#xff0c;目前已进入6、7月份了&#xff0c;你已经成功换工作了吗&#xff1f; 这次我们想聊的&#xff0c;就是程序员跳槽这件事儿&#xff0c;我打算从三个方面来说&…

周志华等人新著!国内第一部AI本科专业教育培养体系出炉

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;不得不感叹&#xff0c;南京大学在人工智能本科教育上的发展速度&#xff0c;确实比国内一众高校快一步。这一次&#xff0c;在AI 本科专业教育培养体系的制定上&#xff0c;南大又一次跑到了最前面。5 月 …

自己实现文本相似度算法(余弦定理)

2019独角兽企业重金招聘Python工程师标准>>> 最近由于工作项目&#xff0c;需要判断两个txt文本是否相似&#xff0c;于是开始在网上找资料研究&#xff0c;因为在程序中会把文本转换成String再做比较&#xff0c;所以最开始找到了这篇关于 距离编辑算法 Blog写的非…

autohotkey快捷键

;已经基本修复了输入带shift的时候跟输入法中英文切换之间的冲突 SetStoreCapslockMode, off SetKeyDelay, 50^CapsLock::#UseHook ;用这个和下面的off能实现代码不冲突,即这个区间的 才有作用,而不出发send right Send {Capslock} #UseHook off returnCapsLock:: Send {Right…

算法实现没思路?最全Python算法实现大礼包!(附学习资源)

整理 | Rachel责编 | Jane出品 | Python大本营&#xff08;ID&#xff1a;pythonnews&#xff09;【导语】数据结构与算法是所有人都要学习的基础课程&#xff0c;自己写算法的过程可以帮助我们更好地理解算法思路&#xff0c;不要轻视每一个算法&#xff0c;一些虽然看似容易&…

【H2645】帧间预测

1、帧间预测原理 先看下图,对比前后两帧图像,只有圆的位置发生变化,因此我们可以根据前一帧图像以及圆移动的信息,合成后一帧图像。这样少编码一帧图像,大大压缩了数据。 实际情况如下图,比对前后两帧,背景一样,只有两人身体发生微小变化,找出并记录这些变化信息,就…

企业网络翻译官——DNS

一、DNS简介 &#xff08;一&#xff09;、DNS原理 DNS 是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写。主要提供域名解析服务。将IP地址转换为相对应的域名&#xff0c;或者将域名解析为相应的IP地址。 &#xff08;二&#xff09;、DNS查询 DNS查询分…

【FFmpeg】AVPacket的使用详解

1、AVPacket简介 AVPacket是存储压缩编码数据相关信息的结构体,内部有压缩数据。它通常由解码器导出,或者作为输入传递给解码器,或者传递给muxers。 对于视频,它通常应该包含一个压缩帧。对于音频,它可能包含几个压缩帧。 重要的变量有以下几个: AVBufferRef *buf; 参…

GitHub日收12000星,微软新命令行工具引爆程序员圈!

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;继上次微软开源计算器刷爆GitHub后&#xff0c;今天凌晨在微软Build大会登场的Windows Terminal&#xff0c;如旋风般目前已登顶GitHub&#xff0c;截至发稿&#xff0c;收获超12000个Star&#xff0c;…