本篇继续介绍Secondary Databases,主要介绍如何使用Secondary Databases。
一.读记录
从Secondary Databases中读取数据跟一般数据库中读取数据没啥两样,最大的区别在于返回的key和data是来自于Primary Database中的。例如下面的例子使用上面一篇创建的Secondary Data,根据名字来查询用户信息。
try {
String searchName = "John Doe";
DatabaseEntry searchKey =
new DatabaseEntry(searchName.getBytes("UTF-8"));
DatabaseEntry primaryKey = new DatabaseEntry();
DatabaseEntry primaryData = new DatabaseEntry();
OperationStatus retVal = mySecondaryDatabase.get(null, searchKey,
primaryKey,
primaryData,
LockMode.DEFAULT);
} catch (Exception e) {
}
跟Database.get()方法一样,如果数据库支持重复记录,你只能获取到重复记录集的第一条记录,要想遍历所有的记录,你必须使用SecondaryCursor。
二.删除记录
一般情况下,你不能直接对Secondary Databases进行修改操作。如果你想修改Secondary Databases,你应该修改Primary Database,并且设置允许JE为你管理Secondary Databases。
但是你可以直接删除Secondary Databases中的记录,这会导致Primary Database中的相应记录被删除掉,而反过来,跟这条记录对应的Secondary Databases中的所有记录信息也会被删除掉。
这以上讨论的一切,必须是基于Primary Database是可写的。
try {
String searchName = "John Doe";
DatabaseEntry searchKey = new DatabaseEntry(searchName.getBytes("UTF-8"));
OperationStatus retVal = mySecondaryDatabase.delete(null, searchKey);
} catch (Exception e) {
}
如果数据库支持重复记录,SecondaryDatabase.delete()方法只能删除重复集中的第一条记录,要想删除全部记录,你必须使用游标。
三.使用游标(Secondary Cursors)
在Secondary Databases使用游标跟你在普通的数据库中使用游标基本上是一样的,你可以使用游标遍历重复记录集。主要的不同有两个:
1.游标返回的值是对应的存在于Primary Database中的记录值
2.SecondaryCursor.getSearchBoth() 方法将不是根据键和值来查询,而是匹配secondary key和primary key。
try {
DatabaseEntry secondaryKey =
new DatabaseEntry(secondaryName.getBytes("UTF-8"));
DatabaseEntry foundData = new DatabaseEntry();
SecondaryCursor mySecCursor =
mySecondaryDatabase.openSecondaryCursor(null, null);
OperationStatus retVal = mySecCursor.getSearchKey(secondaryKey,
foundData,
LockMode.DEFAULT);
while (retVal == OperationStatus.SUCCESS) {
mySecCursor.delete();
retVal = mySecCursor.getNextDup(secondaryKey,
foundData,
LockMode.DEFAULT);
}
} catch (Exception e) {
}
四.数据库连接
如果你有多个secondary databases关联到一个primary database,你可以使用join cursor来进行关联查询。实际上,就是给你了提供一种可以一次联合查询多个条件的机制。
比如说我们有一个关于用户的Primary Database有两个关联的Secondary Databases,分别是关联了性别,年龄,这时候我们想查询的是所有20岁的女性的用户信息,我们就可以使用连接来查询,步骤如下:
1.打开多个二级游标,这些游标必须从关联同一个Primary Datsbase的Secondary Database中获得。
2.定位每个游标到你想查询的位置。
3.创建一个二级游标数组,把之前创建的游标放到这个数组中去。
4.使用Database.join()得到一个连接的游标(join cursor),你要把上一步创建的游标数组传递给这个方法。
5.现在可以操作连接游标了,比如使用JoinCursor.getNext()方法可以访问下个值。
6.关闭连接游标。
7.关闭所有的二级游标。
String theSex = "female";
String theAge = "20";
SecondaryCursor sexSecCursor = null;
SecondaryCursor ageSecCursor = null;
JoinCursor joinCursor = null;
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
try {
DatabaseEntry sex = new DatabaseEntry(theSex.getBytes("UTF-8"));
DatabaseEntry age = new DatabaseEntry(theAge.getBytes("UTF-8"));
sexSecCursor = sexDB.openSecondaryCursor(null, null);
ageSecCursor = ageDB.openSecondaryCursor(null, null);
OperationStatus sexRet =
sexSecCursor.getSearchKey(sex, foundData, LockMode.DEFAULT);
OperationStatus ageRet =
ageSecCursor.getSearchKey(age, foundData, LockMode.DEFAULT);
if (sexRet == OperationStatus.SUCCESS &&
ageRet == OperationStatus.SUCCESS ) {
SecondaryCursor[] cursorArray = {sexSecCursor, ageSecCursor};
joinCursor = personDB.join(cursorArray, null);
while (joinCursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
...
}
}
} catch (DatabaseException dbe) {
} catch (Exception e) {
} finally {
try {
if (sexSecCursor != null) {
sexSecCursor.close();
}
if (ageSecCursor != null) {
ageSecCursor.close();
}
if (joinCursor != null) {
joinCursor.close();
}
} catch (DatabaseException dbe) {
}
}
最后,你还能为JoinCursor设置一个属性:
JoinConfig.setNoSort():指定游标的自动排序是否被禁止。默认情况下,游标会按关联最少的数据量的开始一直到关联对多数据量的。(The cursors are sorted from
the one that refers to the least number of data items to the one that refers to the most.)
JoinConfig config = new JoinConfig();
config.setNoSort(true);
JoinCursor joinCursor = myDb.join(cursorArray, config);
分享到:
相关推荐
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版本