BerkeleyDB-JE 使用BaseAPI(二)

本篇介绍使用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来排序。你可以使用以下几种方法来写数据。
[list]
[*]Database.put()
这是最常用写数据的方法,如果你的数据库不支持重复数据,当要写入的记录键已存在于数据库中时,则旧的记录会被覆盖。这也是修改数据的一种方式。
[*]Database.putNoOverwrite()
这个方法和上面那个方法不同的地方在于,当键已存在于数据库中时,不论数据库是否支持重复数据,都会返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。
[*]Database.putNoDupData()
当你要写入的记录的键和值都和数据库中某条记录项等时,返回OperationStatus.KEYEXIST,并且新的记录无法写到数据库中。
[/list]
当你要写入一条记录到数据库中时,你必须把键和值分别转化为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同样提供了几种方法来读取数据库中的记录。
[list]
[*]Database.get()
根据传来的键来查找记录,若不存在,则返回 OperationStatus.NOTFOUND
[*]Database.getSearchBoth()
根据传来的键和值来查找记录,若不存在,则返回 OperationStatus.NOTFOUND
[/list]
当你要从数据库中读取一条记录时,你必须把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 + "'.");
}

删除记录
删除数据库中存在的记录也有两种方法:
[list]
[*]Database.delete()
这个方法可用来删除匹配传进来的键的记录,若数据库支持重复数据,则所有匹配键的记录都会被删除,如果你要删除重复记录集中的一条记录则必须使用游标。
[*]Environment.truncateDatabase()
这个方法用来清空数据库中所有的记录。
[/list]
下面演示删除记录

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()方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值