<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; bdb</title>
	<atom:link href="http://www.bdbchina.com/tag/bdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Fri, 09 Jul 2010 06:44:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用Oracle Berkeley DB实现空间数据库</title>
		<link>http://www.bdbchina.com/2010/07/%e4%bd%bf%e7%94%a8oracle-berkeley-db%e5%ae%9e%e7%8e%b0%e7%a9%ba%e9%97%b4%e6%95%b0%e6%8d%ae%e5%ba%93/</link>
		<comments>http://www.bdbchina.com/2010/07/%e4%bd%bf%e7%94%a8oracle-berkeley-db%e5%ae%9e%e7%8e%b0%e7%a9%ba%e9%97%b4%e6%95%b0%e6%8d%ae%e5%ba%93/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 02:10:18 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[JE]]></category>
		<category><![CDATA[spatial]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1332</guid>
		<description><![CDATA[关于使用Oracle Berkeley DB作为空间数据库的引擎，可以参考如下资料：
* 使用基于Key/Value 接口的场合，可以考虑Berkeley DB C版本或者Berkeley DB Java 版的产品。可以参考美国University of Virginia的叫做PRIDE的学术论文：http://www.cs.virginia.edu/~stankovic/psfiles/pride.pdf
* 使用Oracle Berkeley DB SQL产品中的R*Tree功能，具体可以参考：http://www.bdbchina.com/2010/04/bdb11gr2的r-tree功能/
更多反馈，欢迎留言。
]]></description>
			<content:encoded><![CDATA[<p>关于使用Oracle Berkeley DB作为空间数据库的引擎，可以参考如下资料：</p>
<p>* 使用基于Key/Value 接口的场合，可以考虑Berkeley DB C版本或者Berkeley DB Java 版的产品。可以参考美国University of Virginia的叫做PRIDE的学术论文：<a href="http://www.cs.virginia.edu/~stankovic/psfiles/pride.pdf">http://www.cs.virginia.edu/~stankovic/psfiles/pride.pdf</a></p>
<p>* 使用Oracle Berkeley DB SQL产品中的R*Tree功能，具体可以参考：<a href="http://www.bdbchina.com/2010/04/bdb11gr2%E7%9A%84r-tree%E5%8A%9F%E8%83%BD/">http://www.bdbchina.com/2010/04/bdb11gr2的r-tree功能/</a></p>
<p>更多反馈，欢迎留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/07/%e4%bd%bf%e7%94%a8oracle-berkeley-db%e5%ae%9e%e7%8e%b0%e7%a9%ba%e9%97%b4%e6%95%b0%e6%8d%ae%e5%ba%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BerkeleyDB 11gR2的R-Tree功能</title>
		<link>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/</link>
		<comments>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 05:43:53 +0000</pubDate>
		<dc:creator>linchunsun</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Linchun Sun]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1211</guid>
		<description><![CDATA[1 背景
R-Tree是一种和BTree类似的数据结构，支持高维数据的快速检索，被广泛应用于各种空间数据中。R-Tree的一个典型的应用是从许多空间对象的信息中找出用户关心的那个。如给定一座城市各个建筑物的经纬度坐标并存储于R-Tree中，用户可以通过“查找当前位置向西五公里内的所有餐厅”，“查找会展中心方圆一公里内的所有汽车站”等方式来查询自己感兴趣的某些特定建筑。
2 BDB11gR2的R-Tree功能
新发布的BerkeleyDB 11gR2(以下简称BDB11gR2）版本能够无缝地兼容SQLite的接口，从而支持各种基于SQLite的应用，包括SQLite自带R-Tree扩展应用。关于SQLite的R-Tree细节，可参见http://www.sqlite.org/rtree.html。
下面，本文将从编译和使用两方面，介绍如何在BDB11gR2中使用R-Tree功能。
2.1 编译
BDB11gR2通过编译开关控制是否启用R-Tree功能。默认情况下，BDB11gR2是不启用R-Tree的。要获得R-Tree的支持，则应该在编译时加上SQLITE_ENABLE_RTREE标志。
Linux平台
 cd build_unix
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_RTREE --enable-sql
make dbsql

Windows平台
在工程文件的属性中，选择 Properties -&#62; Configuration Properties -&#62; c/c++ -&#62; Command Line -&#62; Additional Options, 加入/D  DSQLITE_ENABLE_RTREE，并重新编译工程。
2.2 使用R-Tree
一棵R-Tree实际上对应于一张虚拟表。建立R-Tree索引的过程，实际上就是建立虚拟表的过程。和普通表类似的，我们也可以对这张特殊的虚拟表进行插入，删除，更新等操作。
我们以下面这张图为例来说明R-Tree的典型操作和应用。

在图1中，有三个蓝色的矩形，代表三个建筑的边界，标记为1，2，3。它们的坐标信息如图所示。我们要建立一棵R-Tree，来存储这些矩形的坐标信息，并在此基础上进行一些简单的查询。
建立R-Tree索引
CREATE VIRTUAL TABLE demo_index USING rtree(
id,
minX, maxX,
minY, maxY
);
以上操作建立了一张R-Tree索引表。该索引表中每一条记录代表了一个矩形框。每条记录由5列组成，其中id是一个整数类型的主键，minX，maxX分别代表矩形框横坐标的最小值和最大值，minY，maxY分别代表矩形框纵坐标的最小值和最大值。注意，BDB11gR2中的R-Tree表的列数必须是3-11之间的基数，其中第一列是表的主键，2k和2k+1列分别代表第k维数据的下界和上界(k=1~5).
插入数据
向R-Tree的表中插入数据，和向普通表中插入数据的语法是完全一致的。
以下三条语句插入了图1中的三个矩形：
INSERT INTO demo_index VALUES(
1,
0, 2,
0, 1
);
INSERT INTO demo_index VALUES(
2,
3, 5,
3, 5
);
INSERT INTO demo_index VALUES(
3,
4, 5,
1, 4
);
基于R-Tree的查询
和普通表类似的，用户卡可以对R-Tree表进行查询。如
SELECT id FROM demo_index
WHERE id=1;
但R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 举例如下：
SELECT id FROM [...]]]></description>
			<content:encoded><![CDATA[<h2>1 背景</h2>
<p>R-Tree是一种和BTree类似的数据结构，支持高维数据的快速检索，被广泛应用于各种空间数据中。R-Tree的一个典型的应用是从许多空间对象的信息中找出用户关心的那个。<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML /> <o:AllowPNG /> </o:OfficeDocumentSettings> </xml><![endif]--><span style="font-family: 宋体;" lang="ZH-CN">如给定一座城市各个建筑物的经纬度坐标并存储于R-Tree中，用户可以通过“查找当前位置向西五公里内的所有餐厅”，“查找会展中心方圆一公里内的所有汽车站”等方式来查询自己感兴趣的某些特定建筑。</span></p>
<h2><span style="font-family: 宋体;" lang="ZH-CN"><span id="more-1211"></span></span>2 BDB11gR2的R-Tree功能</h2>
<p>新发布的BerkeleyDB 11gR2(以下简称BDB11gR2）版本能够无缝地兼容SQLite的接口，从而支持各种基于SQLite的应用，包括SQLite自带R-Tree扩展应用。关于SQLite的R-Tree细节，可参见<a onclick="javascript:pageTracker._trackPageview('/outgoing/www.sqlite.org/rtree.html');" href="http://www.sqlite.org/rtree.html">http://www.sqlite.org/rtree.html</a>。<br />
下面，本文将从编译和使用两方面，介绍如何在BDB11gR2中使用R-Tree功能。</p>
<h3>2.1 编译</h3>
<p>BDB11gR2通过编译开关控制是否启用R-Tree功能。默认情况下，BDB11gR2是不启用R-Tree的。要获得R-Tree的支持，则应该在编译时加上SQLITE_ENABLE_RTREE标志。</p>
<p><strong>Linux平台</strong></p>
<blockquote><p><code> cd build_unix<br />
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_RTREE --enable-sql<br />
make dbsql<br />
</code></p></blockquote>
<p><strong>Windows平台</strong></p>
<blockquote><p>在工程文件的属性中，选择 Properties -&gt; Configuration Properties -&gt; c/c++ -&gt; Command Line -&gt; Additional Options, 加入/D  DSQLITE_ENABLE_RTREE，并重新编译工程。</p></blockquote>
<h3>2.2 使用R-Tree</h3>
<p>一棵R-Tree实际上对应于一张虚拟表。建立R-Tree索引的过程，实际上就是建立虚拟表的过程。和普通表类似的，我们也可以对这张特殊的虚拟表进行插入，删除，更新等操作。</p>
<p>我们以下面这张图为例来说明R-Tree的典型操作和应用。</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/rtree.jpg"><img class="size-medium wp-image-1213 aligncenter" title="rtree" src="http://www.bdbchina.com/wp-content/uploads/2010/04/rtree-300x278.jpg" alt="&quot;rtree-pic&quot;" width="300" height="278" /></a></p>
<p>在图1中，有三个蓝色的矩形，代表三个建筑的边界，标记为1，2，3。它们的坐标信息如图所示。我们要建立一棵R-Tree，来存储这些矩形的坐标信息，并在此基础上进行一些简单的查询。</p>
<p><strong>建立R-Tree索引</strong></p>
<blockquote><p>CREATE VIRTUAL TABLE demo_index USING rtree(<br />
id,<br />
minX, maxX,<br />
minY, maxY<br />
);</p></blockquote>
<p>以上操作建立了一张R-Tree索引表。该索引表中每一条记录代表了一个矩形框。每条记录由5列组成，其中id是一个整数类型的主键，minX，maxX分别代表矩形框横坐标的最小值和最大值，minY，maxY分别代表矩形框纵坐标的最小值和最大值。注意，BDB11gR2中的R-Tree表的列数必须是3-11之间的基数，其中第一列是表的主键，2k和2k+1列分别代表第k维数据的下界和上界(k=1~5).</p>
<p><strong>插入数据</strong></p>
<p>向R-Tree的表中插入数据，和向普通表中插入数据的语法是完全一致的。<br />
以下三条语句插入了图1中的三个矩形：</p>
<blockquote><p>INSERT INTO demo_index VALUES(<br />
1,<br />
0, 2,<br />
0, 1<br />
);<br />
INSERT INTO demo_index VALUES(<br />
2,<br />
3, 5,<br />
3, 5<br />
);<br />
INSERT INTO demo_index VALUES(<br />
3,<br />
4, 5,<br />
1, 4<br />
);</p></blockquote>
<p><strong>基于R-Tree的查询</strong></p>
<p>和普通表类似的，用户卡可以对R-Tree表进行查询。如</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE id=1;</p></blockquote>
<p>但R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 举例如下：</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE minX&gt;=0 AND maxX&lt;=3<br />
AND minY&gt;=0 AND maxY&lt;=2;</p>
<p>查询的结果为<br />
1</p></blockquote>
<p>上面这条查询的含义是找出图1中所有被包含在红色虚线矩形框中的矩形。</p>
<blockquote><p>SELECT id FROM demo_index<br />
WHERE maxX&gt;=1 AND minX&lt;=4<br />
AND maxY&gt;=0 AND minY&lt;=4;<br />
查询结果为<br />
1<br />
2</p></blockquote>
<p>上面这条查询的含义是找出图1中所有和黑色虚线矩形框有交集的矩形。</p>
<h2>总结</h2>
<p>R-Tree在高维数据的检索中有着广泛的应用。各种地理信息，带时间记录的归档信息等，都可以通过建立基于R-Tree的索引，来达到快速检索的目的。欢迎通过使用Berkeley DB11gR2的RTree功能来构建自己的R-Tree索引，若有任何相关问题，请联系  Linchun dot sun at Oracle dot com。</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML /> <o:AllowPNG /> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face 	{font-family:"\@宋体"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0in; 	margin-right:0in; 	margin-bottom:10.0pt; 	margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:宋体; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} pre 	{mso-style-priority:99; 	mso-style-link:"HTML Preformatted Char"; 	margin:0in; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Courier New"; 	mso-fareast-font-family:"Times New Roman";} span.HTMLPreformattedChar 	{mso-style-name:"HTML Preformatted Char"; 	mso-style-priority:99; 	mso-style-unhide:no; 	mso-style-locked:yes; 	mso-style-link:"HTML Preformatted"; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	font-family:"Courier New"; 	mso-ascii-font-family:"Courier New"; 	mso-fareast-font-family:"Times New Roman"; 	mso-hansi-font-family:"Courier New"; 	mso-bidi-font-family:"Courier New";} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:宋体; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:8.5in 11.0in; 	margin:1.0in 1.25in 1.0in 1.25in; 	mso-header-margin:.5in; 	mso-footer-margin:.5in; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0in 5.4pt 0in 5.4pt; 	mso-para-margin-top:0in; 	mso-para-margin-right:0in; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0in; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin;} --> <!--[endif]--></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="ZH-CN">建立</span>R-Tree<span style="font-family: 宋体;" lang="ZH-CN">索引</span></p>
<pre>CREATE VIRTUAL TABLE demo_index USING rtree(</pre>
<pre><span>   </span>id,<span>              </span><span> </span></pre>
<pre><span>   </span>minX, maxX,<span>      </span><span> </span></pre>
<pre><span>   </span>minY, maxY<span>       </span><span> </span></pre>
<pre>);</pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">以上操作建立了一张</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">索引表。该索引表一共由</span><span>5</span><span style="font-family: 宋体;" lang="ZH-CN">列组成，每一条记录代表了一个矩形框。其中</span><span>id</span><span style="font-family: 宋体;" lang="ZH-CN">是一个整数类型的主键，</span><span>minX</span><span style="font-family: 宋体;" lang="ZH-CN">，</span><span>maxX</span><span style="font-family: 宋体;" lang="ZH-CN">分别代表矩形框横坐标的最小值和最大值，</span><span>minY</span><span style="font-family: 宋体;" lang="ZH-CN">，</span><span>maxY</span><span style="font-family: 宋体;" lang="ZH-CN">分别代表矩形框纵坐标的最小值和最大值。注意，</span><span>r-tree</span><span style="font-family: 宋体;" lang="ZH-CN">的列数</span><span>n</span><span style="font-family: 宋体;" lang="ZH-CN">必须为</span><span>2m+1</span><span style="font-family: 宋体;" lang="ZH-CN">，其中</span><span>m</span><span style="font-family: 宋体;" lang="ZH-CN">为表示对象的维数。</span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">插入数据</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">在</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">的表中插入数据，和往普通表中插入数据的语法是完全一致的。</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">以下三条语句插入了图</span><span>1</span><span style="font-family: 宋体;" lang="ZH-CN">中的三个矩形：</span></pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre style="text-indent: 24pt;">1,<span>                   </span></pre>
<pre style="text-indent: 24pt;"><span>0</span>, <span>2</span>,<span>  </span></pre>
<pre style="text-indent: 24pt;"><span>0</span>,<span> 1</span><span>     </span></pre>
<pre>);</pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre><span>    </span>2,</pre>
<pre><span>    </span><span>3</span>, <span>5</span>,</pre>
<pre><span>    </span><span>3</span>, <span>5</span></pre>
<pre>);</pre>
<pre>INSERT INTO demo_index VALUES(</pre>
<pre><span>    </span><span>3</span>,</pre>
<pre><span>    </span><span>4</span>, <span>5</span>,</pre>
<pre><span>    </span><span>1</span>, <span>4</span></pre>
<pre>);</pre>
<pre><span> </span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">基于</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">的查询</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">和普通表类似的，用户卡可以对</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">表进行查询。如</span></pre>
<pre>SELECT id FROM demo_index</pre>
<pre><span> </span>WHERE <span>id=1;</span></pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">但</span><span>R-Tree</span><span style="font-family: 宋体;" lang="ZH-CN">表上更为常用和典型的查询则是范围查询</span><span>(Range-Query). </span></pre>
<pre><span> </span></pre>
<pre>SELECT id FROM demo_index<span>     </span></pre>
<pre><span> </span>WHERE minX&gt;=<span>0</span> AND maxX&lt;=<span>3</span></pre>
<pre><span>   </span>AND minY&gt;=<span>0</span> AND maxY&lt;=<span>2</span>;</pre>
<pre><span> </span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">查询的结果为</span></pre>
<pre><span>1</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">这条查询的含义是找出图</span><span>1</span><span style="font-family: 宋体;" lang="ZH-CN">中所有被包含在红色虚线矩形框中的矩形。</span></pre>
<pre>SELECT id FROM demo_index<span>     </span></pre>
<pre><span> </span>WHERE maxX&gt;=<span>1</span> AND minX&lt;=<span>5</span></pre>
<pre><span>   </span>AND maxY&gt;=<span>0</span> AND minY&lt;=<span>4</span>;</pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">查询结果为</span></pre>
<pre><span>1</span></pre>
<pre><span>2</span></pre>
<pre><span>3</span></pre>
<pre><span style="font-family: 宋体;" lang="ZH-CN">这条查询的含义是找出图</span><span>2</span><span style="font-family: 宋体;" lang="ZH-CN">中所有和黑色虚线矩形框有交集的矩形。</span></pre>
</div>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/bdb11gr2%e7%9a%84r-tree%e5%8a%9f%e8%83%bd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(drop-in模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:50 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=980</guid>
		<description><![CDATA[前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。
本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。

1. 编译Android代码
从Android官方网站获取一份Android源代码，这份源代码有2~3G之巨。
在Linux平台上，把源代码解压到$HOME/android/android_src
安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH

先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：

$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make

可看到生成三个镜像：

Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img

2. 安装Android SDK并测试镜像
安装Android SDK: http://developer.android.com/sdk/installing.html, 安装目录：$HOME/android/android-sdk-linux_86
安装Android SDK组件: http://developer.android.com/sdk/adding-components.html,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7
用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。

$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img [...]]]></description>
			<content:encoded><![CDATA[<p>前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。</p>
<p>本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。</p>
<p><span id="more-980"></span></p>
<h2>1. 编译Android代码</h2>
<p>从<a href="http://source.android.com/download">Android官方网站</a>获取一份Android源代码，这份源代码有2~3G之巨。</p>
<p>在Linux平台上，把源代码解压到$HOME/android/android_src</p>
<p>安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:</p>
<pre name="code" class="java:nogutter">
$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH
</pre>
<p>先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make
</pre>
<p>可看到生成三个镜像：</p>
<pre name="code" class="java:nogutter">
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
</pre>
<h2>2. 安装Android SDK并测试镜像</h2>
<p>安装Android SDK: <a href="http://developer.android.com/sdk/installing.html">http://developer.android.com/sdk/installing.html</a>, 安装目录：$HOME/android/android-sdk-linux_86<br />
安装Android SDK组件: <a href="http://developer.android.com/sdk/adding-components.html">http://developer.android.com/sdk/adding-components.html</a>,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7</p>
<p>用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img images
</pre>
<p>创建并运行一个新的设备:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/tools/
$ ./android
</pre>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png" alt="" title="bdb_drop_in_3" width="498" height="287" class="alignnone size-full wp-image-995" /></a></p>
<p>(如图)使用图形界面工具创建一个Android 2.1的设备BDBSQL,并点击&#8221;start&#8221;启动。新的设备第一次启动的时间会非常长，这是正常现象。等到Android界面出现，就说明我们的镜像编译基本没问题了。接下来我们进一步把SQLite库替换为BDB。</p>
<h2>3. 编译DBSQL</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>下载BDB 11gR2源文件(db-5.0.x.tar.gz)，然后</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src/external/sqlite/dist
$ tar zxvf db-5.0.x.tar.gz
$ cp Android.mk Android.mk.bak
$ cp db-5.0.x/build_android/Android.mk .
</pre>
<p>编辑Android.mk，默认的BDB Log和Region文件大小总和可达到十几兆，因此我们有必要修改Android.mk来减小它(可能需要为Android.mk去掉只读属性)。修改第一处LOCAL_CFLAGS如下所示(相对于默认配置，我们删除了-DSQLITE_OMIT_TRUNCATE_OPTIMIZATION，新增了-DSQLITE_DEFAULT_CACHE_SIZE=256 -DBDBSQL_MAX_LOCKS=1000 -DBDBSQL_MAX_LOCK_OBJECTS=1000)：</p>
<pre name="code" class="java:nogutter">
LOCAL_CFLAGS += -Wall -DHAVE_USLEEP=1 \
        -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
        -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_TEMP_STORE=3 \
        -DSQLITE_OS_UNIX=1 \
        -D_HAVE_SQLITE_CONFIG_H -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \
        -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -Dfdatasync=fsync \
        -DSQLITE_DEFAULT_CACHE_SIZE=256 \
        -DBDBSQL_MAX_LOCKS=1000 \
        -DBDBSQL_MAX_LOCK_OBJECTS=1000
</pre>
<p>如果确定不会在多进程间共享数据库，还可以在上述LOCAL_CFLAGS中加入&#8221;-DBDBSQL_OMIT_SHARING&#8221;，这样日志文件不会被写入文件系统，进一步节省了设备空间。</p>
<p>编译系统镜像中的SQLite部分:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
</pre>
<p>编译好了，再来一次镜像替换：</p>
<pre name="code" class="java:nogutter">
$ cp $HOME/android/android_src/out/target/product/generic/*.img $HOME/android/android-sdk-linux_86/platforms/android-2.1/images
</pre>
<p>使用图形界面工具删除先前的设备BDBSQL，重创建一个新的Android 2.1设备BDBSQL,并点击&#8221;start&#8221;启动。这里一定要创建新的设备，因为启动过的设备，其数据库文件已被SQLite生成，DBSQL无法访问。</p>
<h2>4. 使用DBSQL</h2>
<p>现在Android里所有应用程序的SQL存储引擎都已被替换为DBSQL了。我们使用&#8221;联系人&#8221;来试用一下我们的新设备吧，在Setting里面把Locate设置为中文简体，安装一个中文输入法(比如搜狗)，然后打开“联系人”，随便增加一条记录：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg" alt="" title="bdb_drop_in_5" width="600" height="421" class="alignnone size-full wp-image-1001" /></a></p>
<p>在主机上我们可以使用adb shell来查看并操作程序所生成的数据库。请留意sqlite3 shell输出的版本信息是Berkeley DB 11gR，同时shell的提示符是dbsql>，这说明我们已经把SQLite成功替换为DBSQL引擎：</p>
<pre name="code" class="java:nogutter">
$ adb shell
# cd /data/data/com.android.providers.contacts/databases/
# sqlite3 contacts2.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
_sync_state                       status_updates
_sync_state_metadata              v1_settings
activities                        view_contacts
agg_exceptions                    view_contacts_restricted
android_metadata                  view_data
calls                             view_data_restricted
contact_entities_view             view_groups
contact_entities_view_restricted  view_raw_contacts
contacts                          view_raw_contacts_restricted
data                              view_v1_contact_methods
groups                            view_v1_extensions
mimetypes                         view_v1_group_membership
name_lookup                       view_v1_groups
nickname_lookup                   view_v1_organizations
packages                          view_v1_people
phone_lookup                      view_v1_phones
raw_contacts                      view_v1_photos
settings
dbsql> select * from contacts;
2|逍遥 李|||0|0|0|0|1|1|0nE08B4A8BFA37D4||0
dbsql> select * from data;
1||4|1|0|0|0|li|li|||||||||||||||||
2||6|2|0|0|0|66666666|1||66666666|||||||||||||||
3||6|2|0|0|0|88888888|2||88888888|||||||||||||||
4||8|2|0|0|0|蜀山|1|||||||||||||||||
5||4|2|0|0|0|逍遥 李|逍遥|李||||||||||||||||
dbsql>
</pre>
<h2>5. 结束语</h2>
<p>关于DBSQL库在Android平台上的编译和使用的介绍到这里就结束了。我们用两篇博文分别介绍了side-by-side(并存)和Drop-in(替换)这两种使用方式。在Drop-in模式下，现有的应用程序无修改就可以直接使用DBSQL引擎。</p>
<p>DBSQL在开发过程中始终给予Android平台高度重视，在开发过程中投入了多位资深工程师致力于将DBSQL移植到Android平台上，并将Android列为产品周期测试的主流平台。OARDC的工程师Zengfa.Dou和Stephen.Tang给予了我这个初学者极大帮助。在此一并致谢！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:14 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=946</guid>
		<description><![CDATA[Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;以及更多关于Oracle Berkeley DB SQL的报道。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。
本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。

1. 安装开发环境
(本文假定读者已具备初步的Android Emulator使用经验)
安装SDK
从http://developer.android.com/sdk/index.html下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。
安装NDK
从http://developer.android.com/intl/zh-TW/sdk/ndk/index.html下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。

$ cd android-ndk-1.6_r3
$ build/host-setup.sh

安装NDK Wapper
从开心网共享文件夹下载ndk-wrappers.tgz到$HOME/android

$ tar zxvf ndk-wrappers.tgz

ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：
export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc

(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)
开始安装ndk-wrapper：

$ cd ndk-wrappers
$ ./setup.sh

修改Ndk-Wrapper
修改ndk-wrappers/bin/arm-linux-gcc:

1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden

试验Ndk-Wrapper是否可工作
$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见<a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/">博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;</a>以及<a href="http://www.bdbchina.com/2010/03/%E6%9B%B4%E5%A4%9A%E5%85%B3%E4%BA%8Eoracle-berkeley-db-sql%E7%9A%84%E6%8A%A5%E9%81%93/">更多关于Oracle Berkeley DB SQL的报道</a>。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。</p>
<p>本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。</p>
<p><span id="more-946"></span></p>
<h2>1. 安装开发环境</h2>
<p>(本文假定读者已具备初步的Android Emulator使用经验)<br />
<strong>安装SDK</strong><br />
从<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。</p>
<p><strong>安装NDK</strong><br />
从<a href="http://developer.android.com/intl/zh-TW/sdk/ndk/index.html">http://developer.android.com/intl/zh-TW/sdk/ndk/index.html</a>下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。</p>
<pre class="java:nogutter">
$ cd android-ndk-1.6_r3
$ build/host-setup.sh
</pre>
<p><strong>安装NDK Wapper</strong><br />
从开心网<a "http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=557046&#038;start=0">共享文件夹</a>下载ndk-wrappers.tgz到$HOME/android</p>
<pre class="java:nogutter">
$ tar zxvf ndk-wrappers.tgz
</pre>
<p>ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：</p>
<pre class="java:nogutter">export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc
</pre>
<p>(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)</p>
<p>开始安装ndk-wrapper：</p>
<pre class="java:nogutter">
$ cd ndk-wrappers
$ ./setup.sh
</pre>
<p><strong>修改Ndk-Wrapper</strong><br />
修改ndk-wrappers/bin/arm-linux-gcc:</p>
<pre class="java">
1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden
</pre>
<p><strong>试验Ndk-Wrapper是否可工作</strong></p>
<pre class="java:nogutter">$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
<h2>2. 编译DBSQL</h2>
<p>以下我们使用上面搭建的NDK编译环境来编译适用于Android平台上的DBSQL库。首先从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">Oracle官网</a>上下载Berkeley DB 11gR2(.tar.gz), 解压并改名为db/</p>
<p><strong>设置CFLAGS</strong></p>
<pre class="java:nogutter">
$ export CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
-DNDEBUG=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_OS_UNIX=1 -D_HAVE_SQLITE_CONFIG_H \
-DSQLITE_THREAD_OVERRIDE_LOCK=-1 -Dfdatasync=fsync -DNO_ANDROID_FUNCS \
-DSQLITE_THREADSAFE=1"
</pre>
<p><strong>设置为动态编译方式</strong></p>
<pre class="java:nogutter">
$ cd db/build_unix
$ ../dist/configure --prefix=$HOME/android/install_db_arm --target=arm-linux \
--host=arm-linux --enable-smallbuild --enable-sql --enable-sql_compat \
--enable-statistics --enable-amalgamation
</pre>
<p><strong>修改build_unix/db_config.h</strong><br />
每次configure完成后，切记都要编辑build_unix/db_config.h，删除以下两行：</p>
<pre class="java:nogutter">#define HAVE_PREAD 1
#define HAVE_PWRITE 1
</pre>
<p><strong>开始编译</strong></p>
<pre class="java:nogutter">
$ make dbsql
</pre>
<p>生成的动态库文件为.libs/libdb_sql-5.0.so，Shell文件为.libs/dbsql。</p>
<h2>3. 使用DBSQL库</h2>
<p>我们使用现成的DBSQL范例来演示如何在自己的程序中使用DBSQL库</p>
<p><strong>编译范例</strong></p>
<pre class="java:nogutter">
$ cd  build_unix
$ make ex_sql_query
</pre>
<p>编译完成后生成范例程序.libs/ex_sql_query /data/bdb</p>
<p><strong>运行范例</strong><br />
启动Android Emulator，上传，并运行DBSQL库和范例</p>
<pre class="java:nogutter">
$ adb shell mkdir /data/bdb
$ adb shell mkdir /data/sql/examples/data
$ adb shell mkdir /data/sql
$ adb shell mkdir /data/sql/examples
$ adb shell mkdir /data/sql/examples/data
$ adb push .libs/libdb_sql-5.0.so /data/bdb
$ adb push .libs/ex_sql_query /data/bdb
$ adb push ../sql/examples/data/ /data/sql/examples/data
$ adb shell "cd /data/bdb; export LD_LIBRARY_PATH=/data/bdb; ./ex_sql_query"
</pre>
<p>现在终端应该已经输出query范例的运行结果了。以下是GUI终端的输出截图：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg"><img class="alignnone size-full wp-image-975" title="bdbsql_android_sidebyside" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg" alt="" width="480" height="332" /></a></p>
<h2>4. 结束语</h2>
<p>至此，关于BDB 11gR2 SQL库的side-by-side编译模式的介绍就结束了。我们可将编译得到的库应用到自己的程序中去。side-by-side模式的优点不改动Android系统底层库和镜像，使用简单。缺点是只能用C/JNI方式调用，无法用Android自带的SQL接口直接调用。而与此对应的是Drop-in模式，Drop-in模式可将Android系统的SQLite层整个替换为BDB 11gR2 SQL，应用程序无修改就可以直接使用，是一种更为强大彻底的应用模式。我们将在后续文章中介绍Drop-in模式的编译方式。</p>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Oracle Berkeley DB 支持SQL啦！</title>
		<link>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/</link>
		<comments>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:25:41 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=862</guid>
		<description><![CDATA[Oracle Berkeley DB将于2010年3月底发布最新版本Oracle Berkeley DB 11g release 2，具体版本号为 11.2.5.0.xx (xx代表具体的patch版本号)。
除了对原有Oracle Berkeley DB的功能进行了一定的改进和增强（比如提升了数据压缩功能、性能优化、C/C++中系统资源自动管理功能等等），本次发布的版本中最引人瞩目的变化是我们引入了一个有用的新特性——Oracle Berkeley DB SQL,简称DBSQL (纠正：将原BDBSQL纠正为DBSQL)。这是自Berkeley DB诞生20多年来第一次支持SQL接口。这无论是对开源社区，还是对嵌入式数据库行业来说，都将是一件喜事。在此也感谢整个Oracle Berkeley DB 研发团队的努力工作和大家的不断支持。
 
新的版本，新增的SQL接口，值得期待。    
Oracle Berkeley DB SQL接口简介

从Oracle Berkeley DB (简称BDB)诞生以来，它一直扮演着一个嵌入式、提供API调用的、高性能、非关系型的数据库引擎的角色, 被广泛应用于存储、金融、互联网、电子商务、汽车、消费电子、航空及国防等领域。简言之，它是一个1M大小的C语言类库，提供了基于键/值对（key/value pair）形式的并发和事务操作的API给C/C++/Java/C#/PHP等编程语言调用。由于BDB灵活高效的特点，它特别适合一些大数据量的、或者任务密集型的、或者硬件资源受限而性能要求高的嵌入式、跨平台等等的应用需求。
但我们发现，在很多场合对于关系数据库和SQL的需求是大量存在的。在 “edge”（如消费电子）或者一些大型的企业应用（如ERP）中，一个即时高效、并发的，支持SQL的、本地化嵌入式数据库通常是首选。因此，从 Oracle Berkeley DB 11g release 2开始，我们在保留原有基于key/value操作的API的同时，新增加了对SQL的支持。
DBSQL完全兼容SQLite（著名的嵌入式开源关系数据库）原有的编程接口。以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到 Oracle Berkeley DB这个更加强大的引擎。并且，Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作，保证了Oracle Berkeley DB的SQL接口和SQLite保持一致，免除了用户的后顾之忧。此外，Berkeley DB SQL完美支持很多第三方的SQLite工具，如JDBC，ODBC，FireFox 3及其SQLite Manager 插件等。
就具体实现来说，在DBSQL中，我们将原SQLite的底层存储引擎替换为Berkeley DB的数据库引擎。如下图所示：

从上面的DBSQL实现图可以看到，Oracle Berkeley DB引入了SQLite的SQL层：包括用户接口（sqlite3(), [...]]]></description>
			<content:encoded><![CDATA[<p><tt>Oracle Berkeley DB将于2010年3月底发布最新版本Oracle Berkeley DB 11g release 2，具体版本号为 11.2.5.0.xx (xx代表具体的patch版本号)。</tt></p>
<p><tt>除了对原有Oracle Berkeley DB的功能进行了一定的改进和增强（比如提升了数据压缩功能、性能优化、C/C++中系统资源自动管理功能等等），本次发布的版本中最引人瞩目的变化是我们引入了一个有用的新特性——Oracle Berkeley DB SQL,简称DBSQL (纠正：将原<span style="text-decoration: line-through;">BDBSQL</span>纠正为DBSQL)。这是自Berkeley DB诞生20多年来第一次支持SQL接口。这无论是对开源社区，还是对嵌入式数据库行业来说，都将是一件喜事。在此也感谢整个Oracle Berkeley DB 研发团队的努力工作和大家的不断支持。<br />
</tt><tt> </tt></p>
<p><tt>新的版本，新增的SQL接口，值得期待。 <img src='http://www.bdbchina.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  <span id="more-862"></span><strong> </strong></tt></p>
<p><tt><strong>Oracle Berkeley DB SQL接口简介</strong><br />
</tt></p>
<p><tt>从Oracle Berkeley DB (简称BDB)诞生以来，它一直扮演着一个嵌入式、提供API调用的、高性能、非关系型的数据库引擎的角色, </tt><tt>被广泛应用于存储、金融、互联网、电子商务、汽车、消费电子、航空及国防等领域</tt><tt>。简言之，它是一个1M大小的C语言类库，提供了基于键/值对（key/value pair）形式的并发和事务操作的API给C/C++/Java/C#/PHP等编程语言调用。由于BDB灵活高效的特点，它特别适合一些大数据量的、或者任务密集型的、或者硬件资源受限而性能要求</tt><tt>高</tt><tt>的嵌入式、跨平台等等的应用需求。</tt></p>
<p><tt>但我们发现，在很多场合对于关系数据库和SQL的需求是大量存在的。在 “edge”（如消费电子）或者一些大型的企业应用（如ERP）中，一个即时高效、并发的，支持SQL的、本地化嵌入式数据库通常是首选。因此，从 Oracle Berkeley DB 11g release 2开始，我们在保留原有基于key/value操作的API的同时，新增加了对SQL的支持。</tt></p>
<p><tt>DBSQL完全兼容SQLite（著名的嵌入式开源关系数据库）原有的编程接口。以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到 Oracle Berkeley DB这个更加强大的引擎。并且，Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作，保证了Oracle Berkeley DB的SQL接口和SQLite保持一致，免除了用户的后顾之忧。此外，Berkeley DB SQL完美支持很多第三方的SQLite工具，如JDBC，ODBC，FireFox 3及其SQLite Manager 插件等。</tt></p>
<p><tt>就具体实现来说，在DBSQL中，我们将原SQLite的底层存储引擎替换为Berkeley DB的数据库引擎。如下图所示：<br />
</tt></p>
<div id="attachment_864" class="wp-caption aligncenter" style="width: 372px"><tt><tt><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb-sql-architecture.jpg"><img class="size-full wp-image-864" title="Oracle Berkeley DB SQL 架构图" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb-sql-architecture.jpg" alt="Oracle Berkeley DB SQL 架构图" width="362" height="289" /></a></tt></tt><p class="wp-caption-text">Oracle Berkeley DB SQL 架构图</p></div>
<p><tt>从上面的DBSQL实现图可以看到，Oracle Berkeley DB引入了SQLite的SQL层：包括用户接口（sqlite3(), ODBC, JDBC等）和SQL语言处理层（Tokenizer、Parser及Generator），而底层引擎（虚拟机）则使用了BDB的存储引擎。从而，将原来SQLite基于数据库级别的并发提升一个级别 - 至BDB的基于页(Page)级别的并发，并可以利用BDB的更好的内存管理、数据和事务恢复功能、更多的扩展（如Berkeley DB的db_hotbackup、db_stat、db_archive等一系列命令行工具）。<br />
</tt></p>
<p><tt>Oracle Berkeley DB 11g release 2在主流平台经过了严格的、多重的测试和认证（每个平台涵盖以十万计的测试案例），测试平台包括Solaris、*nix、Windows系列(XP, 7, Mobile)、Android 2.0(及以上)、VxWorks等等。此外，我们还提供了大量工具和资料帮助用户熟悉这套最新接口。随版本一起发布的，包括SQLite到Oracle Berkeley DB数据迁移指南、JDBC/ODBC使用指南、全文检索（Full Text Search）向导、空间数据库（R*Tree）向导、Android平台上使用向导、数据库使用手册及调优向导、数据管理员手册、测试集、代码示例等完善的资料，进一步帮助用户放心地来使用我们的产品。了解更多SQLite的语法、API、命令行等帮助，还可以参考SQLite.org上的文档。</tt></p>
<p><tt>总结一下: DBSQL接口是一个1M大小的C语言类库，是一个高效并发的嵌入式数据库。它支持in-memory cache选项，某些场合可作为内存数据库的一个替代方案。它支持C/C++/Java/PHP等语言接口和通过JDBC/ODBC等驱动程序访问。它运行于Unix/POSIX、Windows家族、VxWorks、QNX、Android等平台。和SQLite一样，</tt><tt>它</tt><tt>支持SQL92标准。<br />
</tt></p>
<p><tt><strong>Berkeley DB SQL和SQLite使用上的区别</strong></tt></p>
<p><tt>a) 对于用户和开发人员来说，</tt><tt>这两个产品是没有区别的。它们在SQL语法、API、命令行交互、PRAGAMAs 等方面都是一致的。我认为，用户可以体验的显著区别有可能是性能和并发了 - 由于SQLite提供的是数据库级别的锁，而Berkeley DB  SQL是页(Page)级别的锁，因此后者在绝大多数测试中都会快很多 （如Insert, Update, Delete,  并发操作等）。但是，由于DBSQL提供的细粒度锁的机制，它又会带来一些额外的开销，一些极端的测试用例下会比SQLite慢上少许(但不明显)。并且对于这些极端测试的案例，我们一直在进行性能优化。</tt></p>
<p><tt>b) 对于已有的SQLite应用程序和</tt><tt>工具而言，由于这两者在调用接口都是一致的，因而都可以无缝支持。</tt></p>
<p><tt>c) 对于DBA人员来说，</tt><tt>除了可以继续使用SQLite原来的管理工具，您还可以使用BDB提供</tt><tt>的db_hotbackup、db_stat、db_archive等一系列命令行工具来备份，监控，升级等。另外，您还可以联系Oracle寻求支持。<br />
</tt></p>
<p><tt>总体而言，</tt><tt>我们有充分理由相信</tt><tt>Oracle Berkeley DB  SQL将会比SQLite更快，更稳定。同时，我们也将会提供更好的支持服务。</tt></p>
<p><tt><strong>DBSQL接口和BDB key/value接口的比较</strong><br />
</tt></p>
<p><tt>我们举个例子说明这两套API在开发上的区别。</tt></p>
<p><tt>假设有一个employee的BDB数据库（注：一个BDB的数据库，即相当于关系型数据库中的一张二维表），我们定义其主键字段为：key{empId, email}，定义其value包含字段：value{empName, sex, age,  startDate, status}。相应的，对应于Oracle 关系型数据库的表结构为：<br />
</tt></p>
<blockquote><p><tt>TABLE: employee {<br />
</tt><tt>empId PRIMARY KEY,<br />
</tt><tt> email </tt><tt>PRIMARY KEY,<br />
</tt><tt> empName,<br />
</tt><tt> sex,<br />
</tt><tt> age,<br />
</tt><tt> startDate,<br />
</tt><tt> status<br />
</tt><tt>}</tt></p></blockquote>
<p><tt>接下来，对于数据库的操作，在BDB的语法大致为：<br />
- </tt><tt>要插入一条记录，</tt><tt>employeeDatabase.put(key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>},  value{'John Smith', 'male', 30, 2005-01-01, 'OK'});<br />
- 随后，如果要更新上面那条记录：</tt><tt>employeeDatabase.put(key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>},  value{'John Smith', 'male', 60, 2005-01-01, 'Retired'});<br />
- 如果删除该条记录，则：</tt><tt>employeeDatabase.delete(</tt><tt>key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>}</tt><tt>);  // 此处只需要提供key即可<br />
- 查询记录：</tt><tt>employeeDatabase.get(</tt><tt>key{1000, <a href="mailto:john.smith@foo.com">john.smith@foo.com</a>}</tt><tt>);  // 此处只需要提供key即可</tt></p>
<p><tt>在DBSQL中，上面的增删改操作都可以通过标准的SQL语言来进行。如更新一条记录，可写成：</tt></p>
<p style="padding-left: 30px;"><tt>update employee set age=60, status='Retired' where empId=1000 and email='john.smith@foo.com';</tt></p>
<p><tt><strong>总结</strong><br />
</tt></p>
<p><tt>最后，需要强调的是，DBSQL是作为对BDB已有功能的一个补充而不是替代。</tt><tt>它只是本次BDB发布产品的一个新特性，并且将会像Hash、Queue、集群等功能一样持续下去。</tt><tt>它的出现在一定程度上更丰富了BDB的应用场景。用户可以根据自己的需要，选择适合的BDB接口：</tt></p>
<ul>
<li><tt>当用户需要非常高的性能，管理非关系型数据，或者以Queue、Hash等方式来组织和访问数据的时候，可以继续选择 Oracle  Berkeley DB的既有key/value  API。如大型企业系统中单点登录、消息队列、工作流等模块，如管理XML、声音、照片、视频等场合，如SOA中的BAM模块、业务规则引擎，如云计算或者云存储节点上，等等。</tt></li>
<li><tt>而在用户需要一个本地持久化的支持SQL的嵌入式数据库时，DBSQL将成为优先的选择。比如，手机的通讯录、个人web站点、桌面端 的应用（如股票软件、浏览器客户端的缓存和存储）及开发工具（如IDE）、中小企业的数据库系统、企业实时系统的一些缓存模块、小型的关系型内存数据库等 等。</tt></li>
</ul>
<p><tt>正式版本的Oracle Berkeley DB 11g release 2将于2010年3月底发布。Oracle Berkeley DB整个产品家族继续以开源形式发布，并对开源社区提供支持。更多</tt><tt>关于</tt><tt>Oracle Berkeley DB 11g release 2的新功能和特性，请关注我们的官方网站（</tt><tt>http://www.oracle.com/database/berkeley-db/index.html</tt><tt>）或者本博客的后续文章。</tt></p>
<p><tt>请至官方网站下载最新版本的Oracle Berkeley DB数据库系列产品，包括Oracle Berkeley DB （及SQL），Oracle Berkeley DB Java版和Oracle Berkeley DB XML数据库。<br />
</tt></p>
<p><tt>更多需求和反馈，欢迎留言或者给我发邮件：chao.huang[at]oracle.com。</tt></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>更多关于Oracle Berkeley DB SQL的报道</title>
		<link>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/</link>
		<comments>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 01:17:56 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=923</guid>
		<description><![CDATA[Oracle Berkeley DB 11g release   2即将发布，更多的用户可能会关心其SQL接口的一些具体衡量指标，包括性能、并发性、可扩展性以及客户反馈（包括开源社区和合作伙伴等）。下面是我目前收集到的信息，希望能对大家有用。
内部测试数据（总的指标，包括Berkeley DB以及SQL）：

性能：

约以万计(10s of thousands)的Insert/Update/Delete每秒；
约以十万计(100s of thousands)的Select每秒；
约比native SQLite快3倍；
有些极端测试比SQLite慢，但在一个数量级别。


并发性

细粒度的锁（Page level locking），保证了更好的并行读/写；
TPC-B测试显示，多线程的情形下（比单线程）快6-8倍；
支持数据库运行中的进行数据压缩（database online compact）。


可扩展性

单个数据库支持TB级别的数据量；
支持多节点集群。


数据同步

可以通过Oracle Mobile Server 10.3向企业端的大型Oracle数据库进行同步；
Xcsdasd 的同步客户端。


SQL功能集

SQLite3 API, SQL92标准；
ODBC，JDBC标准；
支持Full-Text Search 和R*Tree （Spatial，空间数据库）。


运行平台

Windows Mobile, 2000, XP, 7

Andriod
VxWorks
Linux, Solaris, HP/UX and virtually any *nix variant




注意：由于测试不具有代表性和平台环境等差异，这些指标仅供大家参考。


合作伙伴及用户反馈：

Mike Owens, “The Definitive Guide to SQLite”一书的作者：

Oracle Berkeley DB's new SQLite compatibly offers powerful features for its users and the [...]]]></description>
			<content:encoded><![CDATA[<p><tt>Oracle Berkeley DB 11g release   2即将发布，更多的用户可能会关心其SQL接口的一些具体衡量指标，包括性能、并发性、可扩展性以及客户反馈（包括开源社区和合作伙伴等）。下面是</tt><tt>我</tt><tt>目前收集到的信息，希望能对大家有用。</tt></p>
<h3><strong><tt>内部测试</tt><tt>数据</tt></strong><tt><strong>（总的指标，包括Berkeley DB以及SQL）：</strong></tt></h3>
<ul>
<li><tt>性能：</tt>
<ul>
<li><tt>约以万计(10s of thousands)的Insert/Update/Delete每秒；</tt></li>
<li><tt>约以十万计(100s of thousands)的Select每秒；</tt></li>
<li><tt>约比native SQLite快3倍；</tt></li>
<li><tt>有些极端测试比SQLite慢，但在一个数量级别。</tt></li>
</ul>
</li>
<li><tt>并发性</tt>
<ul>
<li><tt>细粒度的锁（Page level locking），保证了更好的并行读/写；</tt></li>
<li><tt>TPC-B测试显示，</tt><tt>多线程的情形下（比单线程）快6-8倍；</tt></li>
<li><tt>支持数据库运行中的进行数据压缩（database online compact）。</tt></li>
</ul>
</li>
<li><tt>可扩展性</tt>
<ul>
<li><tt>单个数据库支持TB级别的数据量；</tt></li>
<li><tt>支持多节点集群。</tt></li>
</ul>
</li>
<li><tt>数据同步</tt>
<ul>
<li><tt>可以通过</tt><tt>Oracle Mobile Server 10.3向企业端的大型Oracle数据库进行同步；</tt></li>
<li><tt>Xcsdasd 的同步客户端。</tt></li>
</ul>
</li>
<li><tt>SQL功能集</tt>
<ul>
<li><tt>SQLite3 API, SQL92标准；</tt></li>
<li><tt>ODBC，JDBC标准；</tt></li>
<li><tt>支持Full-Text Search 和R*Tree （Spatial，空间数据库）。</tt></li>
</ul>
</li>
<li><tt>运行平台</tt>
<ul>
<li><tt>Windows Mobile, 2000, XP, 7<br />
</tt></li>
<li><tt>Andriod</tt></li>
<li><tt>VxWorks</tt></li>
<li><tt>Linux, Solaris, HP/UX and virtually any *nix variant<br />
</tt></li>
</ul>
</li>
</ul>
<blockquote><p><tt><strong><em>注意：由于测试不具有代表性和平台环境等差异，这些指标仅供大家参考。</em></strong></tt></p>
<p><tt></tt></p></blockquote>
<p><span id="more-923"></span></p>
<h3><tt><strong>合作伙伴及用户反馈：</strong></tt></h3>
<ul>
<li><tt>Mike Owens, “The Definitive Guide to SQLite”一书的作者：</tt></li>
</ul>
<blockquote><p><tt>Oracle Berkeley DB's new SQLite compatibly offers powerful features for its users and the SQLite community at large. The combination of the two technologies provides developers with tremendous flexibility in a single SQL/API.  Oracle has done a fantastic job of integrating the technologies, and also being an exemplary participant in the open source community by contributing time, expertise and resources to the SQLite project.<br />
</tt></p></blockquote>
<ul>
<li><tt>Dr. Richard Hipp, SQLite 数据库的作者及架构师：</tt></li>
</ul>
<blockquote><p><tt>Oracle Berkeley DB 11g combines seamlessly the benefits of SQLite’s ubiquitous API with Berkeley DB’s concurrency and performance into an easy-to-use product. SQLite users can now benefit from enhanced concurrency and performance, and Oracle Berkeley DB users can now benefit from an easy-to-use SQL API.<br />
</tt></p></blockquote>
<ul>
<li><tt>Liam McLoughlin, Google Chromium OS的开发者：</tt></li>
</ul>
<blockquote><p><tt>In my experience Berkley DB 11gR2 is a fully drop-in replacement for SQLite3. I was hugely surprised at just how easy it was; I'd had zero experience in using Berkeley DB in products before, but within a couple hours I had my application powered by Berkeley DB. From there you get all the benefits of Berkeley DB including concurrency and long term stability compared to SQLite3 from an API you're already familiar with. It's quite simply amazing.<br />
</tt></p></blockquote>
<ul>
<li><tt>Marie-Anne Neimat, Oracle 数据库产品研发的VP（仿谷歌对VP的解释为：数据库研发全球副总裁）</tt></li>
</ul>
<blockquote><p><tt>Mobile applications and mobile infrastructure applications need fast, scalable and reliable storage services - yet must be self-managing and operate without administrators.  With new SQL capabilities and Android support, Oracle Berkeley DB 11g  makes it easier for developers to quickly develop and deploy new ‘edge’ applications that meet users high performance and scalability demands.<br />
</tt></p></blockquote>
<ul>
<li><tt>Marco Bambini, SQLabs的CEO</tt></li>
</ul>
<blockquote><p><tt>Berkeley DB 11gR2 combines the familiar SQLite API with the powerful, proven Berkeley DB data storage technology. I re-compiled my SQLiteManager product against the Berkeley DB library without any major issues in very little time. I have now a product that is fully able to manage BDB databases without changing a single line of my code. Performance and concurrency are excellent and I am thrilled to think about the future of this great product.</tt></p></blockquote>
<p><tt>最后，关于Oracle Berkeley DB 11g release 2</tt><tt>的</tt><tt>更多垂询，欢迎留言或者给我发邮件：chao.huang[at]oracle.com。请至官方网址：</tt><tt>http://www.oracle.com/database/berkeley-db/index.html 下载</tt><tt>Oracle Berkeley DB 11g release 2。</tt></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 833px; width: 1px; height: 1px; overflow: hidden;"><em>http://www.oracle.com/corporate/pricing/pricelists.html</em></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/%e6%9b%b4%e5%a4%9a%e5%85%b3%e4%ba%8eoracle-berkeley-db-sql%e7%9a%84%e6%8a%a5%e9%81%93/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BDB Java Edition + prefuse, 轻松实现数据可视化</title>
		<link>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/</link>
		<comments>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 11:04:39 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=784</guid>
		<description><![CDATA[数据可视化概述
这些年来，随着大量数据的产生，数据可视化（data visualization）广泛应用于科研、军事、金融、医疗等等领域。我们的生活也到处可见数据可视化的例子。比如，股票软件上显示的K线图，调查结果的柱状图、曲线图，人口分布的密度图等等等等。
那么，什么是数据可视化呢？根据维基百科的解释：Data visualization is the study of the visual representation of data, meaning &#8220;information which has been abstracted in some schematic form, including attributes or variables for the units of information&#8221;。简单来说，数据可视化就是用更加直观更加生动易懂的图形图像表现某种特定的数据集合。
这篇文章将简单介绍如何轻松利用BDB Java Edition （JE）和prefuse实现自己的数据可视化应用。
可视化工具和数据库的选择
首先我们选择prefuse作为数据可视化工具。prefuse是一个轻量级的用于可视化任意数据集（visualize the data）的java类库，它提供了多种数据可视化模式，比如柱状图、树图、饼图等等。它的优点是简单易用、可视化功能齐全。
但仅仅有可视化工具是不够的，还需要什么呢？当然还必须有存储数据的数据库。可以打个比方，数据是一栋房子，数据可视化就是我们要给房子做装修，让它更好看，那么数据库就是地基。没有地基，何来房子，更不用说装修了。那么，我们选择什么样的数据库呢。既然prefuse是java类库，而我们JE的特点是纯Java实现，性能高，footprint小等等，那么，JE绝对是一个很好的选择。
好了，现在就让我们看看JE + prefuse的威力吧。
数据集属性的定义
首先，我们选择需要做可视化的数据集。在这里，我给出的例子是可视化某个公司的员工数据，包括他们的基本属性，上下级关系和各自所参与的任务。
1. 员工（Employee）的属性
@Entity
public class Employee {
    @PrimaryKey
    int employeeId;

    @SecondaryKey(relate [...]]]></description>
			<content:encoded><![CDATA[<h2>数据可视化概述</h2>
<p>这些年来，随着大量数据的产生，数据可视化（data visualization）广泛应用于科研、军事、金融、医疗等等领域。我们的生活也到处可见数据可视化的例子。比如，股票软件上显示的K线图，调查结果的柱状图、曲线图，人口分布的密度图等等等等。</p>
<p>那么，什么是数据可视化呢？根据维基百科的解释：<strong>Data visualization</strong> is the study of the visual representation of data, meaning &#8220;information which has been abstracted in some schematic form, including attributes or variables for the units of information&#8221;。简单来说，数据可视化就是用更加直观更加生动易懂的图形图像表现某种特定的数据集合。</p>
<p>这篇文章将简单介绍如何轻松利用BDB Java Edition （JE）和<a href="http://prefuse.org/">prefuse</a>实现自己的数据可视化应用。</p>
<h2>可视化工具和数据库的选择</h2>
<p>首先我们选择prefuse作为数据可视化工具。prefuse是一个轻量级的用于可视化任意数据集（visualize the data）的java类库，它提供了多种数据可视化模式，比如柱状图、树图、饼图等等。它的优点是简单易用、可视化功能齐全。</p>
<p>但仅仅有可视化工具是不够的，还需要什么呢？当然还必须有存储数据的数据库。可以打个比方，数据是一栋房子，数据可视化就是我们要给房子做装修，让它更好看，那么数据库就是地基。没有地基，何来房子，更不用说装修了。那么，我们选择什么样的数据库呢。既然prefuse是java类库，而我们JE的特点是纯Java实现，性能高，footprint小等等，那么，JE绝对是一个很好的选择。</p>
<p>好了，现在就让我们看看JE + prefuse的威力吧。<span id="more-784"></span></p>
<h2>数据集属性的定义</h2>
<p>首先，我们选择需要做可视化的数据集。在这里，我给出的例子是可视化某个公司的员工数据，包括他们的基本属性，上下级关系和各自所参与的任务。</p>
<p><strong>1. 员工（Employee）的属性</strong></p>
<pre class="java:nogutter">@Entity
public class Employee {
    @PrimaryKey
    int employeeId;

    @SecondaryKey(relate = MANY_TO_ONE)
    String employeeName;

    @SecondaryKey(relate = MANY_TO_ONE)
    float salary;

    @SecondaryKey(relate = MANY_TO_ONE, relatedEntity=Employee.class,
                 onRelatedEntityDelete=NULLIFY)
    int managerId;

    @SecondaryKey(relate = MANY_TO_ONE, relatedEntity=Department.class,
                 onRelatedEntityDelete=NULLIFY)
    int departmentId;

    @SecondaryKey (relate =MANY_TO_MANY, relatedEntity=ServiceRequest.class,
                 onRelatedEntityDelete=NULLIFY)
    Set&lt;Integer&gt; SRIds = new HashSet&lt;Integer&gt;();

    String address;
    String email;
    String phone;

    /* setter and getter functions. */
}</pre>
<p><strong>2. 部门（Department）的属性</strong></p>
<pre class="java:nogutter">@Entity
class Department {
    @PrimaryKey
    int departmentId;

    @SecondaryKey(relate = ONE_TO_ONE)
    String departmentName;

    String location;

    /* setter and getter functions. */
}</pre>
<p><strong>3. 任务（ServiceRequest）的属性</strong></p>
<pre class="java:nogutter">@Entity
class ServiceRequest {
	@PrimaryKey
	int SRId;

	String title;
	String content;

/* setter and getter functions. */
}</pre>
<h2>数据可视化效果</h2>
<p>我们选择两种可视化方式：弧形树（radial tree）和节点树（node link tree）。下面看看我们的可视化效果。</p>
<p>利用radial tree来显示整个公司的结构（organization chart)：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot1.png"><img class="aligncenter size-large wp-image-835" title="snapshot" src="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot1-1024x628.png" alt="" width="839" height="514" /></a></p>
<p>上图左边最大的窗口显示的是整个公司的结构图。从图中可以看出公司有四个部门。每一个有颜色小节点代表一名员工，不同部门的员工具有不同的颜色。节点之间的连线表示上下级关系。上图右上角的小窗口显示的是选中的员工的具体信息。右下角的小窗口显示的是JE database 的schema图。从中可以看出我们定义了三个Entity: Employee, Department以及Service Request.</p>
<p>点击任意一个员工节点，将可以显示此员工的上下级结构图，也就是在此公司与之有关系的所有员工的结构图。比如我们点击名字叫Goodstein A. Chavez 的员工，结果如下图所示：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot2.png"><img class="aligncenter size-full wp-image-836" title="snapshot2" src="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot2.png" alt="" width="528" height="402" /></a></p>
<p>从上图可以看出，此员工有四名直接下属，而他的老板直接向公司的CEO汇报。</p>
<p>除了可以直接点击员工节点（基于员工ID）进行查询，我们还可以通过部门ID（Department ID）经理ID（Manager ID）和具体的任务ID（SR ID）和员工姓名来对员工进行查询。下面是对部门ID和任务ID查询的结果截图。</p>
<p>部门2的员工结构图（DeparmentID = 2）</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/byDepartment.png"><img class="aligncenter size-large wp-image-842" title="byDepartment" src="http://www.bdbchina.com/wp-content/uploads/2010/03/byDepartment-1024x261.png" alt="" width="805" height="205" /></a></p>
<p>部门2中，参与了任务3的员工（DeparmentID = 2 and SRId = 3）</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bySR.png"><img class="aligncenter size-large wp-image-843" title="bySR" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bySR-1024x265.png" alt="" width="803" height="208" /></a></p>
<p>值得一提的是，所有这些关系的查询都可以利用在JE里面定义的Entity之间的关系（relation），而不需要我们做额外的查询工作，比如想通过经理ID来查询此经理的直接下属，一句代码便可以实现：</p>
<p>dao.employeeByManagerId.subIndex(Integer.valueOf(searchKey)).entities();</p>
<h2>JE+prefuse的优势总结</h2>
<ol>
<li><strong>简单易用</strong>：用过JE的朋友都知道，利用JE（特别是JE DPL）能够十分轻松、灵活定义各种数据集模型，其get/put操作也特别简单，而且能够很容易写出特定的查询语句。而prefuse也提供了功能齐全的可视化API。所以，利用JE做数据的存取操作，利用prefuse做数据的可视化操作，其对接是十分直接和简便的。</li>
<li><strong>Footprint小</strong>：拿上面所举的员工数据可视化应用例子来说，整个应用程序打成可直接运行的jar文件才1.87M，但功能却很齐全（多种可视化效果，多种查询方式）。这样大小的程序，即使安装在一般的移动设备（比如手机）上运行都绰绰有余。</li>
<li><strong>性能高：</strong>数据可视化的性能主要体现在做查询和可视化的速度。还是以员工数据可视化为例，插入员工数据有1000条，存储到JE 数据库的大小是729k。之后用户对节点的点击和在输入框的查询，其可视化结果都能迅速得以显示（笔者没有做过具体的时间记录，但相信所需时间都是毫秒级的）。</li>
</ol>
<h2>结束语</h2>
<p>从这个例子我们可以看出在数据可视化方面，利用JE作为存储引擎是一个很好的选择。有兴趣的朋友不妨一试。另外，这里有一个十分有趣例子，是利用JE和Google Visualization API来可视化一栋房子的用电情况（ electric usage of Hypatia House），感兴趣的朋友请参考以下链接：<a href="http://excitedcuriosity.wordpress.com/2010/02/22/its-electric-ted-data-storage-and-plotting/">http://excitedcuriosity.wordpress.com/2010/02/22/its-electric-ted-data-storage-and-plotting/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>欢迎加入Berkeley DB群@LinkedIn</title>
		<link>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/</link>
		<comments>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:19:01 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=791</guid>
		<description><![CDATA[首先祝各位访客新年快乐，虎年富贵吉祥！
Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：http://www.linkedin.com/groups?gid=2131985. 欢迎加入！
Oracle Berkeley DB 中国研发团队
]]></description>
			<content:encoded><![CDATA[<p>首先祝各位访客新年快乐，虎年富贵吉祥！</p>
<p>Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：<a href="http://www.linkedin.com/groups?gid=2131985">http://www.linkedin.com/groups?gid=2131985</a>. 欢迎加入！</p>
<p>Oracle Berkeley DB 中国研发团队</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Google Android平台上运行Berkeley DB Java Edition</title>
		<link>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/</link>
		<comments>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 06:53:49 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=735</guid>
		<description><![CDATA[Google 推出Android平台一年多以来，Android已经成为最受欢迎的手机操作系统之一（另外几个成熟的手机操作平台包括Symbian, iPhone/MacOS, Windows Mobile等）。目前，已经至少有12款手机使用Android平台，并且据报道将会有更多的手机采用Android平台。
Android平台内置的存储数据库（或者说存储引擎）是SQLite。但由于SQLite其自身的一些缺陷，比如非Java语言、并发读写性能不 佳、技术支持困难等等，所以我们的用户倾向于Berkeley DB。我在这里向大家推荐Berkeley DB Java Edition（简称BDB JE）。我们可以把BDB JE的优势（它除了是存Java语言实现外，还有很高的存储性能和良好的并发性支持、Oracle的开发及技术支持团队等等）充分运用到Android 平台上。众所周知，Android平台是类Java语言的，所以，BDB JE对Android平台的开发者而言是一款利器。
以下将手把手教你将BDB JE快速配置到Android平台上（本文，我们用Android在PC机上的模拟器 (avd) 作为实例平台）。

准备工作

 如果你的电脑上尚未安装Android SDK。那么首先点击这里下载并且安装 Android SDK。Android的官方主页上有详细的如何安装并且启动Android 模拟器（avd）的文档，这里就不再涉及。必须注意的一点是， 将你所安装的Android目录下（假如是&#60;android-installation -home&#62;）的 “tools” 文件夹路径加入到你电脑的路径（path）中去（相信有一定编程经验的读者一定很熟悉如何添加系统路径了），这样，你就可以直接在命令行上运行 Android的各种命令了。


点此下载最新版本的BDB JE。解压缩之后（假如你解压路径为JE_HOME/）可以看到在JE_HOME/lib/ 下有一个“je-android-4.0.71.jar”文件。如果找不到，说明你下载的不是最新版本的BDB JE。请到Oracle BDB JE官方网址进行下载：http://www.oracle.com/technology/products/berkeley-db/je/index.html。


在开始下面教程之前，我默认大家已经有一定的Android编程基础，如果没有，请大家到Android的官方主页上阅读相关文档（比如，如 何实现“hello world”）.

选择一：在装有Android 插件的Eclipse 编程环境下进行配置

 如果你编程的IDE是Eclipse，并且你已经在上面安装了Android编程插件（如何在Eclipse上安装Android插件，请看这里），那么就继续阅读本小节以下步骤。注意，我用的是Eclipse3.4.2（Ganymede）版本， 也许不同的版本配置上有稍微的区别。这里建议Eclipse3.4版本以上。


打开Eclipse，确认在Windows-&#62;Preference-&#62;Android下已经写入Android SDK的路径。进入"File-&#62;New-&#62;Project-&#62;Android-&#62;Android Project-&#62;Next Project"，在弹出的建立project的面板上选择build target（比如Android2.0），并填写Project name (JEExample)、 application name (JEExample)、package name (com.sleepycat.je) 和 activity name (JEExample)。最后点击Finish。Eclipse将会自动帮你生成一个Android工程。假设你所建立的工程路径是&#60;eclipse-je-android-dir&#62;


 进入”Project-&#62;Properties-&#62;Libraries-&#62;Add External [...]]]></description>
			<content:encoded><![CDATA[<p>Google 推出Android平台一年多以来，Android已经成为最受欢迎的手机操作系统之一（另外几个成熟的手机操作平台包括Symbian, iPhone/MacOS, Windows Mobile等）。目前，已经至少有12款手机使用Android平台，并且据报道将会有更多的手机采用Android平台。</p>
<p>Android平台内置的存储数据库（或者说存储引擎）是SQLite。但由于SQLite其自身的一些缺陷，比如非Java语言、并发读写性能不 佳、技术支持困难等等，所以我们的用户倾向于Berkeley DB。我在这里向大家推荐Berkeley DB Java Edition（简称BDB JE）。我们可以把BDB JE的优势（它除了是存Java语言实现外，还有很高的存储性能和良好的并发性支持、Oracle的开发及技术支持团队等等）充分运用到Android 平台上。众所周知，Android平台是类Java语言的，所以，BDB JE对Android平台的开发者而言是一款利器。</p>
<p>以下将手把手教你将BDB JE快速配置到Android平台上（本文，我们用Android在PC机上的模拟器 (avd) 作为实例平台）。</p>
<p><span id="more-735"></span></p>
<h2>准备工作</h2>
<ul>
<li> 如果你的电脑上尚未安装Android SDK。那么首先<a onclick="javascript:pageTracker._trackPageview('/outgoing/developer.android.com/sdk/index.html');" href="http://developer.android.com/sdk/index.html" target="_blank">点击这里下载</a>并且安装 Android SDK。Android的官方主页上有详细的如何安装并且启动Android 模拟器（avd）的文档，这里就不再涉及。必须注意的一点是， 将你所安装的Android目录下（假如是<code>&lt;android-installation -home&gt;）</code>的 “tools” 文件夹路径加入到你电脑的路径（path）中去（相信有一定编程经验的读者一定很熟悉如何添加系统路径了），这样，你就可以直接在命令行上运行 Android的各种命令了。</li>
</ul>
<ul>
<li><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.oracle.com/technology/software/products/berkeley-db/je/index.html');" href="http://www.oracle.com/technology/software/products/berkeley-db/je/index.html" target="_blank">点此下载</a>最新版本的BDB JE。解压缩之后（假如你解压路径为JE_HOME/）可以看到在JE_HOME/lib/ 下有一个“je-android-4.0.71.jar”文件。如果找不到，说明你下载的不是最新版本的BDB JE。请到Oracle BDB JE官方网址进行下载：<a href="http://www.oracle.com/technology/products/berkeley-db/je/index.html" target="_blank"><span class="moz-txt-link-freetext">http://www.oracle.com/technology/products/berkeley</span>-db/je/index.html</a>。</li>
</ul>
<ul>
<li>在开始下面教程之前，我默认大家已经有一定的Android编程基础，如果没有，请大家到Android的官方主页上阅读相关文档（比如，如 何实现“hello world”）.</li>
</ul>
<h2>选择一：在装有Android 插件的Eclipse 编程环境下进行配置</h2>
<ul>
<li> 如果你编程的IDE是Eclipse，并且你已经在上面安装了Android编程插件（如何在Eclipse上安装Android插件，请看<a onclick="javascript:pageTracker._trackPageview('/outgoing/developer.android.com/intl/zh-CN/sdk/eclipse-adt.html#installing');" href="http://developer.android.com/intl/zh-CN/sdk/eclipse-adt.html#installing" target="_blank">这里</a>），那么就继续阅读本小节以下步骤。注意，我用的是Eclipse3.4.2（Ganymede）版本， 也许不同的版本配置上有稍微的区别。这里建议Eclipse3.4版本以上。</li>
</ul>
<ul>
<li>打开Eclipse，确认在Windows-&gt;Preference-&gt;Android下已经写入Android SDK的路径。进入<code>"File-&gt;New-&gt;Project-&gt;Android-&gt;Android Project-&gt;Next Project"</code>，在弹出的建立project的面板上选择build target（比如Android2.0），并填写Project name (JEExample)、 application name (JEExample)、package name (<code>com.sleepycat.je</code>) 和 activity name (<code>JEExample</code>)。最后点击Finish。Eclipse将会自动帮你生成一个Android工程。假设你所建立的工程路径是<code>&lt;eclipse-je-android-dir&gt;</code></li>
</ul>
<ul>
<li> 进入”Project-&gt;Properties-&gt;Libraries-&gt;Add External JARs”，在弹出的窗口中选择JE_HOME/lib/je-android-4.0.71.jar。点击OK，你将可以看到在你建立的工程 （JEExample）下面有Referenced Libraries目录，点击之后可以看到je-android-4.0.71.jar。</li>
</ul>
<ul>
<li> <code>复制代码（这些代码可在下面的"源代码"小节找到）</code><code>：</code>
<ul>
<li><code>将JEExample.java</code> 复制到<code>&lt;eclipse-je-android-dir&gt;/src/com/sleepycat/je</code></li>
<li><code>将main.xml</code> 复制到<code>&lt;eclipse-je-android-dir&gt;/</code> <code>res/layout/main.xml</code> and</li>
<li><code>将strings.xml</code> 复制到 <code>&lt;eclipse-je-android-dir&gt;/</code><code>res/values/strings.xml</code></li>
</ul>
</li>
<li> 在Eclipse中，打开main.xml，你可以看到在上一步中复制的代码。点击Run，运行JEExample。在正确运行之前，你还需要在 Android上面建立一个用于存储JE数据的文件夹，具体步骤看“在Android模拟器上运行程序”小节中的第一步。</li>
</ul>
<h2>选择二：在非IDE环境下进行配置</h2>
<ul>
<li> 如果你不喜欢用IDE（如Eclipse)进行编程，只想通过命令行进行配置，请继续阅读本小节以下步骤。</li>
</ul>
<ul>
<li>首先建立一个Android 的模拟器（AVD）（如果你还没有在你的电脑上建立过Android 的模拟器）：
<ul>
<li><code>在命令行运行 android create avd --target 3 --name my_avd</code> （注意，我在这里建立的是Android1.6的模拟器，你也可以建立Android2.0模拟器）</li>
<li>在你想要建立Android工程的目录下面，运行
<ul>
<li><code>android create project --path JEExample --package com.sleepycat.je --name JEExample --activity JEExample --target 3</code></li>
</ul>
<p>命令运行之后，将在你所在目录下面建立Android工程，文件夹的名称叫做JEExample，其中会有 <code>JEExample/src/com/sleepycat/je/JEExample.java 文件。<br />
</code></li>
</ul>
</li>
<li> 将JE_HOME/lib/je-android-4.0.71.jar 文件复制到<code>JEExample/libs</code></li>
</ul>
<ul>
<li> 将三个文件：<code>JEExample/src/com/sleepycat/je/JEExample.java</code>，     <code>JEExample/res/layout/main.xml </code><code>和 JEExample/res/values/strings.xml</code> 替换成下面“源代码”小节中对应的三个文件：<code>JEExample.java</code>，     <code>main.xml</code> 和 <code>strings.xml</code>。</li>
</ul>
<ul>
<li> 进入<code>&lt;android-installation-home&gt;/platforms/android-1.6/tools</code>， 打开 <code>dx.bat</code> 文件， 将其中一行 “<code>REM set javaOpts=-Xmx256M</code>” 改成 “<code>set javaOpts=-Xmx512M</code>“。注意“REM”要去掉。另外，如果你之前建立的Android模拟器 （AVD）是Android2.0，那么就更改<code>android-2.0/tools下的dx.bat文件。</code></li>
</ul>
<ul>
<li> 运行Android 模拟器：emulator -avd <code>my_avd</code></li>
</ul>
<ul>
<li> 用命令行进入JEExample目录，然后运行命令
<ul>
<li><code>ant install</code></li>
</ul>
</li>
</ul>
<p style="padding-left: 30px;">这个命令将会编译<code>JEExample.java</code> ，然后生成<code>JEExample/bin/JEExample-debug.apk</code> ，并将它安装到你所运行的Android 模拟器中。</p>
<h2>在Android模拟器上运行示例程序</h2>
<ul>
<li> 首先，为Android程序建立JE environment 路径，用于存储JE的数据（这一步不可忽略，并且路径名要跟程序一致，否则无法正确运行程序）。具体做法是 ：
<ul>
<li><code>在命令行运行adb shell mkdir /data/local/je</code>。或者你首先运行adb shell，然后cd data/local，最后mkdir je。</li>
<li>你也可以删除这个文件夹：<code>rm /data/local/je/*。更多adb shell的命令请参照Android文档。</code></li>
</ul>
</li>
<li> 在Android模拟器窗口上点击三角按钮（在Home界面）进入程序列表，在这里你可以看到已经安装上去的 JEExample 程序图标, 点击它，运行JEExample程序。 进入程序之后，在程序界面最上方可以看到  “JEExample”  字样，下面是一个 文字编辑框（TextEdit box）, 还有两个按钮，分别是 “Put Data” 和  “Get Data” 。</li>
</ul>
<ul>
<li> 存数据：
<ul>
<li>在文字编辑框里输入 key/data 数据对（比如 k1/d1）然后点击 “Put Data” 按钮，这样一条数据（键是k1，值是d1）便存进JE数据库中。</li>
</ul>
</li>
</ul>
<p style="padding-left: 30px;">你可以在命令行运行adb shell，进入<code>/data/local/je， 就可以看到JE的存储数据。</code></p>
<ul>
<li> 读数据：
<ul>
<li>在文字在文字编辑框里输入 你之前存储的键值key（比如k1），然后点击 “Get Data” 按钮，将会弹出“Get Data”的对话框，上面显示你之前存储的数据（比如d1）。</li>
</ul>
</li>
</ul>
<h2>JE示例源代码</h2>
<ul>
<li> JEExample.java
<pre><code>
package com.sleepycat.je;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.File;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;

public class JEExample extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        try {
            final File envDir = new File("/data/local/je");
            final EnvironmentConfig envConfig = new EnvironmentConfig();
            envConfig.setTransactional(true);
            envConfig.setAllowCreate(true);
            final Environment env = new Environment(envDir, envConfig);
            final DatabaseConfig dbConfig = new DatabaseConfig();
            dbConfig.setTransactional(true);
            dbConfig.setAllowCreate(true);
            dbConfig.setSortedDuplicates(true);
            final Database db = env.openDatabase(null, "exampledb", dbConfig);

            setContentView(R.layout.main);
            final Button button1 = (Button) findViewById(R.id.do_put);
            button1.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {

                    final EditText editText =
                        (EditText) findViewById(R.id.entry);
                    final String keyData = editText.getText().toString();
                    final int idx = keyData.indexOf("/");
                    String key = null;
                    String data = null;
                    String result = null;
                    if (idx &lt; 0) {
                        result = "enter key/data to put";
                    } else {
                        key = keyData.substring(0, idx);
                        data = keyData.substring(idx + 1);
                        result = key + "/" + data;
                        final DatabaseEntry keyEntry =
                            new DatabaseEntry(key.getBytes());
                        final DatabaseEntry dataEntry =
                            new DatabaseEntry(data.getBytes());

                        try {
                            final Transaction txn =
                                env.beginTransaction(null, null);
                            final OperationStatus res =
                                db.put(txn, keyEntry, dataEntry);
                            if (res != OperationStatus.SUCCESS) {
                                result = "Error: " + res.toString();
                            }
                            txn.commit();
                        } catch (DatabaseException DE) {
                            result = "Caught exception: " + DE.toString();
                        }
                    }
                    Log.d("JE", "did put of: " + result);

                    if (result.contains("Caught exception:")) {
                    	new AlertDialog.Builder(JEExample.this).
                    	    setTitle("Put Data").setMessage(result).
                    	    setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                    		    public void onClick(DialogInterface dialog, int whichButton) {
                    		    }
                    		}).show();
                    } else {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Put Data").setMessage("You put the key/data pair: " + result).
                	        setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    }
                }
            });

            final Button button2 = (Button) findViewById(R.id.do_get);
            button2.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {

                    final EditText editText =
                        (EditText) findViewById(R.id.entry);
                    final String key = editText.getText().toString();
                    final DatabaseEntry keyEntry =
                        new DatabaseEntry(key.getBytes());
                    final DatabaseEntry dataEntry = new DatabaseEntry();
                    String result = null;
                    try {
                        final Transaction txn =
                            env.beginTransaction(null, null);
                        final OperationStatus res =
                            db.get(txn, keyEntry, dataEntry, null);
                        if (res != OperationStatus.SUCCESS) {
                            result = "Error: " + res.toString();
                        } else {
                            result = new String(dataEntry.getData());
                        }
                        txn.commit();
                    } catch (DatabaseException DE) {
                        result = "Caught exception: " + DE.toString();
                    }
                    Log.d("JE", "did get of: " + result);
                    if (result.contains("Caught exception:")) {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Get Data").setMessage(result).
                	        setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    } else {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Get Data").setMessage("Get result: " + result).
                	        setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    }
                }
            });
        } catch (Exception DE) {
            TextView tv = new TextView(this);
            tv.setText("blew chunks " + DE);
            setContentView(tv);
        }
    }
}
</code></pre>
</li>
<li> res/layout/main.xml
<pre><code>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    &gt;

  &lt;TextView android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="JEExample"
    /&gt;

  &lt;EditText android:id="@+id/entry"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@android:drawable/editbox_background"
            android:layout_below="@id/label"
    /&gt;

  &lt;Button android:id="@+id/do_put"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_put"
    /&gt;

  &lt;Button android:id="@+id/do_get"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_get"
    /&gt;
&lt;/LinearLayout&gt;
</code></pre>
</li>
<li> res/values/strings.xml
<pre><code>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;resources&gt;
    &lt;string name="app_name"&gt;JEExample&lt;/string&gt;
    &lt;string name="button_put"&gt;Put Data&lt;/string&gt;
    &lt;string name="button_get"&gt;Get Data&lt;/string&gt;
&lt;/resources&gt;</code></pre>
</li>
</ul>
<h2>结束语</h2>
<p>怎么样，是不是很简单就可以将JE配置到Android中了？你也赶紧试试吧。如果在配置或者安装过程中出错，欢迎给我留言。</p>
<p>注：英文好的同学，可以参照JE最新发布包中的&lt;je-home&gt;/docs/HOWTO-Android.html的英文原文。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Berkeley DB三大产品收费模式</title>
		<link>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 08:21:58 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=711</guid>
		<description><![CDATA[众所周知，Berkeley DB是开源的，个人用户可以下载做学习、试用。但实际上，Berkeley DB是Oracle的一个产品，也是要收费的。
英文好的同学，可以读一下我们的授权申明：http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html。
英文不好的同学，我在此可以稍作解释（强调：我的观点仅作参考，Oracle公司拥有最终解释权）：
1.  Berkeley DB产品家族三大产品（BDB，BDB-JE和BDB-XML）都是采取双license的授权模式，即开源（免费使用）和商用（付费使用）两种模式。
2. 衡量两种授权模式的一个主要区别是 &#8211; “redistribute”，意即你是否将自己的应用程序（在你的应用中使用了BDB）发布给第三方，如客户，机构，附属机构，母公司，合作者，中间商，第三方的非营利组织等。
3. 举例子来说：

如果是个人用户做学习研究之用，可以选择开源授权，免费；


如果是个人用户在BDB上做一些应用，如果你的应用是开源发布的，可以选择开源授权（但要符合BSD、GPL等开源条款）；如果是闭源，需要选择商业授权；


如果是在公司的商用项目使用，需要选择商业授权，即付费；

如果大家再有问题，或者不确定，欢迎留言。版权保护，也是保护到每个IT从业人员。
&#8212;
附件： Oracle官方网站给出TimesTen和Berkeley DB 产品家族在美国市场参考价格（见下图）。
关于Oracle产品的价格清单，请浏览官方网址: http://www.oracle.com/corporate/pricing/pricelists.html. 
注意： 价格仅作参考，Oracle公司拥有最终解释权。
]]></description>
			<content:encoded><![CDATA[<p>众所周知，Berkeley DB是开源的，个人用户可以下载做学习、试用。但实际上，Berkeley DB是Oracle的一个产品，也是要收费的。</p>
<p>英文好的同学，可以读一下我们的授权申明：http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html。</p>
<p>英文不好的同学，我在此可以稍作解释（<strong>强调：我的观点仅作参考，Oracle公司拥有最终解释权</strong>）：</p>
<p>1.  Berkeley DB产品家族三大产品（BDB，BDB-JE和BDB-XML）都是采取双license的授权模式，即开源（免费使用）和商用（付费使用）两种模式。</p>
<p>2. 衡量两种授权模式的一个主要区别是 &#8211; “<strong>redistribute</strong>”，意即你是否将自己的应用程序（在你的应用中使用了BDB）发布给第三方，如客户，机构，附属机构，母公司，合作者，中间商，第三方的非营利组织等。</p>
<p>3. 举例子来说：</p>
<ul>
<li>如果是个人用户做学习研究之用，可以选择开源授权，免费；</li>
</ul>
<ul>
<li>如果是个人用户在BDB上做一些应用，如果你的应用是开源发布的，可以选择开源授权（但要符合BSD、GPL等开源条款）；如果是闭源，需要选择商业授权；</li>
</ul>
<ul>
<li>如果是在公司的商用项目使用，需要选择商业授权，即付费；</li>
</ul>
<p>如果大家再有问题，或者不确定，欢迎留言。版权保护，也是保护到每个IT从业人员。</p>
<p>&#8212;</p>
<p><strong><em>附件： Oracle官方网站给出TimesTen和Berkeley DB 产品家族在美国市场参考价格（见下图）。</em></strong></p>
<div id="attachment_779" class="wp-caption aligncenter" style="width: 612px"><a href="http://www.bdbchina.com/wp-content/uploads/2009/11/BDB_price.png"><img class="size-full wp-image-779 " title="BDB Price" src="http://www.bdbchina.com/wp-content/uploads/2009/11/BDB_price.png" alt="Berkeley DB 价格清单" width="602" height="231" /></a><p class="wp-caption-text">Berkeley DB 价格清单</p></div>
<p><em>关于Oracle产品的价格清单，请浏览官方网址: http://www.oracle.com/corporate/pricing/pricelists.html. </em></p>
<p><em>注意： 价格仅作参考，Oracle公司拥有最终解释权。</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/11/berkeley-db%e4%b8%89%e5%a4%a7%e4%ba%a7%e5%93%81%e6%94%b6%e8%b4%b9%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
Դ