本篇介绍使用BaseAPI来操作Java简单类型的数据。
首先我们知道JE中的数据库是键值对的集合,那么数据库中的每一条记录都是一个键值对。键和值可以是任何简单类型的对象,也可以是自定义的复杂类型的对象。在JE中是用 DatabaseEntry类来表示键和值的。这个类可以持有任何类型的数据,只要这个数据可以转化为字节数组。
我们现在演示下字符串类型的数据转化为DatabaseEntry
String aKey = "key";
String aData = "data";
try {
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
} catch (Exception e) {
// Exception handling goes here
}
相应的,也可以从DatabaseEntry中获取字符串类型的数据值
byte[] myKey = theKey.getData();
byte[] myData = theData.getData();
String key = new String(myKey, "UTF-8");
String data = new String(myData, "UTF-8");
总之,DatabaseEntry对象就是BaseAPI操作JE的基础,所有的CRUD操作都离不开它。
BaseAPI提供了两种方式来读写数据:
1.使用database.get()和database.put()方法。
2.使用游标。
本篇只介绍第一种方法。
写数据
默认情况下,JE中的记录是根据key值来排序的,如果数据库允许有重复数据,则在重复数据集中还根据data来排序。你可以使用以下几种方法来写数据。
- Database.put()
这是最常用写数据的方法,如果你的数据库不支持重复数据,当要写入的记录键已存在于数据库中时,则旧的记录会被覆盖。这也是修改数据的一种方式。
- Database.putNoOverwrite()
这个方法和上面那个方法不同的地方在于,当键已存在于数据库中时,不论数据库是否支持重复数据,都会返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。
- Database.putNoDupData()
当你要写入的记录的键和值都和数据库中某条记录项等时,返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。
当你要写入一条记录到数据库中时,你必须把键和值分别转化为DatabaseEntry对象,这意味着你要把键和值从java对象转化成字节数组。
下面演示下写数据。
String aKey = "myFirstKey";
String aData = "myFirstData";
try {
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));
myDatabase.put(null, theKey, theData);
} catch (Exception e) {
// Exception handling goes here
}
读数据
BaseAPI同样提供了几种方法来读取数据库中的记录。
- Database.get()
根据传来的键来查找记录,若不存在,则返回 OperationStatus.NOTFOUND
- Database.getSearchBoth()
根据传来的键和值来查找记录,若不存在,则返回 OperationStatus.NOTFOUND
当你要从数据库中读取一条记录时,你必须把DatabaseEntry对象转化为值所对应的对象,这意味着你要用字节数组来构造值。
下面演示读取数据
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry();
// Perform the get.
if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
// Recreate the data String.
byte[] retData = theData.getData();
String foundData = new String(retData, "UTF-8");
System.out.println("For key: '" + aKey + "' found data: '" +
foundData + "'.");
} else {
System.out.println("No record found for key '" + aKey + "'.");
}
删除记录
删除数据库中存在的记录也有两种方法:
- Database.delete()
这个方法可用来删除匹配传进来的键的记录,若数据库支持重复数据,则所有匹配键的记录都会被删除,如果你要删除重复记录集中的一条记录则必须使用游标。
- Environment.truncateDatabase()
这个方法用来清空数据库中所有的记录。
下面演示删除记录
try {
String aKey = "myFirstKey";
DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
// Perform the deletion. All records that use this key are
// deleted.
myDatabase.delete(null, theKey);
} catch (Exception e) {
// Exception handling goes here
}
最后要注意的是,当你对数据库做出了改变,实际上改变并没有被立即写入到磁盘中,它仅存在于内存中,有两种方式你可以保证你做出的改变的持久化:
1.使用事务,默认情况下每当事务提交的时候,JE被把变化写入磁盘。
2.如果由于某些原因,你没有使用事务,那你必须在每次变化发生后显示的调用Environment.sync()方法来确保变化被写入到磁盘。实际上在你每次关闭Environment时,JE也会自动的调用Environment.sync()方法。
分享到:
相关推荐
Oracle BerkeleyDB-JE je-6.0.11
BerkeleyDB-Core-C-GSG.pdf bdb c开发手册 英文版
Berkeley DB JE-7.0.6 jar包
Java-Edition-BerkeleyDB-3.1.0,国外的开源数据库,供大家参考
(二) Berkeley DB -- Access Method Configuration_iyangjian2005997_新浪博客.mht
BerkeleyDB和Sqlite是当前最流行的嵌入式开源数据库。
db-6.1.26.tar.gz berkeley db
Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht
Life After BerkeleyDB- OpenLDAP's Memory-Mapped Database
关于berkeley db 4.6.2的介绍性文章,是了解berkeley db的技术文档。
berkeley db je-6.4.9.gz
Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯、SQL解析等步骤,本文件是早期版本
嵌入式数据库,功能强大,可用于如QQ本地的聊天记录数据库等,使用方便,效率高
官方版本,亲测可用
Berkeley DB 4.4.20 .tar.gz 来自https://www.oracle.com/database/technologies/related/berkeleydb-release-history.html
来自于oracle的BerkeleyDB帮助文件,里面有代码的。
1. Introduction to Berkeley DB ......... 1 About This Manual .......... 2 Berkeley DB Concepts ........... 2 Access Methods ......... 4 Selecting Access Methods ......... 4 Choosing between BTree and ...
文件类型的DB,存取速度快,操作方便,是以map方式key-value方式存取数据.兄弟大家共享!
BerkeleyDB:BerkeleyDB-对Berkeley DB 2.x或更高版本的Perl5访问
使用BerkeleyDB数据库,java语言开发需要的jar包资源,7.5.11版本