本篇开始介绍游标(Cursors)的应用,主要介绍打开关闭游标以及使用游标来定位记录。
在JE中你可以使用游标来遍历记录,还可以使用游标来增删改记录。同时游标还是唯一一种可以用于访问重复记录集中记录的机制。
一.打开和关闭游标
你可以使用Database.openCursor()方法来打开一个游标,使用Cursor.close()方法来关闭它。需要注意的是关闭游标的顺序,你必须先关闭游标,再关闭Database,最后关闭Environment。
Environment myDbEnvironment = null;
Database myDatabase = null;
Cursor myCursor = null;
try {
...
myCursor = myDatabase.openCursor(null, null);
} catch (DatabaseException dbe) {
} finally {
try {
if (myCursor != null) {
myCursor.close();
}
if (myDatabase != null) {
myDatabase.close();
}
if (myDbEnvironment != null) {
myDbEnvironment.close();
}
} catch(DatabaseException dbe) {
System.err.println("Error in close: " + dbe.toString());
}
}
二.获取记录
游标提供了很多API用于检索记录:
- Cursor.getNext()
移动游标到下一个记录所在的位置。
- Cursor.getPrev()
移动游标到前一个记录所在的位置。
以上两个API非常简单。
- Cursor.getSearchKey()
这个方法允许你传入一个key值,游标会移动到该传入key值对应的记录所在的位置。
- Cursor.getSearchKeyRange()
这个方法允许你传入一个key值,游标会移动到大于等于该传入key值对应的记录所在的位置。
- Cursor.getSearchBoth()
这个方法允许你传入key值和value值(即一个记录),游标会移动到等于该传入记录的所在的位置。
- Cursor.getSearchBothRange()
这个方法允许你传入key值和value值(即一个记录),游标会移动到键相等并且值会大于等于该传入记录值的记录所在的位置。
这上面的4个API是用来查找记录的,下面用例子解释下,比如我们的数据库中有这样的记录:
Key | Value |
a | v |
b | v |
b | vv |
b | vvv |
d | v |
d | vvv |
Method | Key | Value | Found |
getSearchKey | a | | a/v |
getSearchKeyRange | b | | b/v |
getSearchKeyRange | c | | d/v |
getSearchBoth | b | vv | b/vv |
getSearchBothRange | d | vv | d/vvv |
- Cursor.getNextNoDup()
用于在重复记录集中,游标移动到下一个key值不同的记录
- Cursor.getPrevNoDup()
用于在重复记录集中,游标移动到上一个key值不同的记录
- Cursor.getNextDup()
用于在重复记录集中,游标移动到下一个key值相同的记录
- Cursor.getPrevDup()
用于在重复记录集中,游标移动到上一个key值相同的记录
- Cursor.count()
计算当前重复记录集中的记录个数。
最后这几个API是用于重复记录集的,我们继续用之前的那个数据来演示下,假设当前的游标位于b/vv
Method | Found |
getNextNoDup | d/v |
getPrevNoDup | a/v |
getNextDup | b/vvv |
getPrevDup | b/v |
getPrevDup | 3 |
下面演示下API的例子,先从最简单的getNext开始。
Cursor cursor = null;
try {
...
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
cursor = myDatabase.openCursor(null, null);
while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
String theKey = new String(foundKey.getData(), "UTF-8");
String theData = new String(foundData.getData(), "UTF-8");
System.out.println("Key | Data : " + theKey + " | " +
theData + "");
}
} catch (Exception e) {
} finally {
cursor.close();
}
getPrev是类似的,然后我们演示下查找的API
String searchKey = "Alaska";
String searchData = "Fa";
Cursor cursor = null;
try {
...
cursor = myDatabase.openCursor(null, null);
DatabaseEntry theKey =
new DatabaseEntry(searchKey.getBytes("UTF-8"));
DatabaseEntry theData =
new DatabaseEntry(searchData.getBytes("UTF-8"));
cursor = myDatabase.openCursor(null, null);
OperationStatus retVal = cursor.getSearchBothRange(theKey, theData,
LockMode.DEFAULT);
if (retVal == OperationStatus.NOTFOUND) {
System.out.println(searchKey + "/" + searchData +
" not matched in database " +
myDatabase.getDatabaseName());
} else {
String foundKey = new String(theKey.getData(), "UTF-8");
String foundData = new String(theData.getData(), "UTF-8");
System.out.println("Found record " + foundKey + "/" + foundData +
"for search key/data: " + searchKey + "/" + searchData);
}
} catch (Exception e) {
} finally {
cursor.close();
}
最后演示下游标操作重复记录集
Cursor cursor = null;
try {
...
DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry();
cursor = myDatabase.openCursor(null, null);
OperationStatus retVal = cursor.getSearchKey(theKey, theData,
LockMode.DEFAULT);
if (cursor.count() > 1) {
while (retVal == OperationStatus.SUCCESS) {
String keyString = new String(theKey.getData(), "UTF-8");
String dataString = new String(theData.getData(), "UTF-8");
System.out.println("Key | Data : " + keyString + " | " +
dataString + "");
retVal = cursor.getNextDup(theKey, theData, LockMode.DEFAULT);
}
}
} catch (Exception e) {
} finally {
cursor.close();
}
分享到:
相关推荐
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解析等步骤,本文件是早期版本
Berkeley DB4.8以上各版本,已经亲测过哪些版本可与redhat6.5兼容,见附件名称备注。
嵌入式数据库,功能强大,可用于如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访问