<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_幸运星空</title><subtitle type="text">Lucker的程序人生</subtitle><id>http://feed.cnblogs.com/blog/u/38860/rss</id><updated>2012-01-13T09:42:15Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/38860/rss"/><entry><id>http://www.cnblogs.com/luckeryin/archive/2012/01/13/2321903.html</id><title type="text">C#面向对象模式设计第十七讲：Mediator 中介者模式（行为型模式）</title><summary type="text">（根据MSDN WebCast相关课程整理） 中介者模式的依赖关系： 多个对象彼此之间存在错综复杂的依赖关系，当一个对象发生变化时，可能会引发多个对象随之发生变化。当采用一个中间对象后，该对象不保存与...</summary><published>2012-01-13T09:42:00Z</published><updated>2012-01-13T09:42:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2012/01/13/2321903.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2012/01/13/2321903.html"/><content type="html">&lt;p&gt;（根据MSDN WebCast相关课程整理）&lt;/p&gt; &lt;p&gt;中介者模式的依赖关系： &lt;p&gt;多个对象彼此之间存在错综复杂的依赖关系，当一个对象发生变化时，可能会引发多个对象随之发生变化。当采用一个中间对象后，该对象不保存与其它对象的引用，各个对象只和这个中间对象发生依赖后，问题就变化简单明晰啦。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741285337.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741334907.jpg" width="580" height="176"&gt;&lt;/a&gt; &lt;p&gt;设计模式就是用方法来解耦，解耦的目的为了应对变化。 &lt;p&gt;GoF：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用，它们都由中介者来引用，从而使耦合松散，而且可以独立的改变他们之间的交互。 &lt;p&gt;中介者起到了管理复杂关系的作用。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741378839.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741448146.jpg" width="470" height="214"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;示例，我们通过“Cut”菜单来剪切文本框中的文本，同时允许撤消操作： &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741496571.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131741566302.jpg" width="468" height="295"&gt;&lt;/a&gt; &lt;p&gt;各个原来相依赖的对象都继承自Element类，这样，它们就都可以引用mediator对象，而Mediator类中又拥有各大对象的引用List，这就实现了对各对象的引用，从而，实现了mediator与各个对象之间的相互引用，而去掉了各对象之间的引用。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131742073194.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201131742147974.jpg" width="378" height="367"&gt;&lt;/a&gt; &lt;p&gt;&amp;lt;完&amp;gt; &lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2321903.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2012/01/13/2321903.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2012/01/11/2319771.html</id><title type="text">C#面向对象模式设计第十六讲：Interpreter 解释器模式（行为型模式）</title><summary type="text">（根据MSDN WebCast相关课程整理） 把变化的东西抽象成一种类似于“语言”的东西，让我们的对象来解析它，从而适应变化的需求。 示例：在一个将汉字转化为数字的项目中，随着需要解析的汉字数据越来...</summary><published>2012-01-11T10:04:00Z</published><updated>2012-01-11T10:04:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2012/01/11/2319771.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2012/01/11/2319771.html"/><content type="html">&lt;p&gt;（根据MSDN WebCast相关课程整理）&lt;/p&gt; &lt;p&gt;把变化的东西抽象成一种类似于“语言”的东西，让我们的对象来解析它，从而适应变化的需求。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803134416.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803143968.jpg" width="402" height="201"&gt;&lt;/a&gt; &lt;p&gt;示例：在一个将汉字转化为数字的项目中，随着需要解析的汉字数据越来越大，需要解析方法能够随之处理更大级别的数据（万，亿…），通过扩展Express类，产生能够解析新增的级别的处理方法。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/20120111180318507.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803234962.jpg" width="533" height="403"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803248211.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803265537.jpg" width="476" height="178"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803277914.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803285273.jpg" width="501" height="109"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803323481.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803395787.jpg" width="578" height="498"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/20120111180342963.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803459030.jpg" width="475" height="226"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201111803479912.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/20120111180357284.jpg" width="624" height="619"&gt;&lt;/a&gt; &lt;p&gt;&amp;lt;完&amp;gt; &lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2319771.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2012/01/11/2319771.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318410.html</id><title type="text">C#面向对象模式设计第十五讲：Command 命令模式（行为型模式）</title><summary type="text">（根据MSDN WebCast相关课程整理） 实体对象与行为操作之间往往也存在耦合关系。 行为请求者通过“命令”行为实现者去执行一定的行为。 GoF：将请求封装成一个对象，从而使我们可用不同的请求对客...</summary><published>2012-01-10T10:13:00Z</published><updated>2012-01-10T10:13:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318410.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318410.html"/><content type="html">&lt;p&gt;（根据MSDN WebCast相关课程整理）&lt;/p&gt; &lt;p&gt;实体对象与行为操作之间往往也存在耦合关系。 &lt;p&gt;行为请求者通过“命令”行为实现者去执行一定的行为。 &lt;p&gt;GoF：将请求封装成一个对象，从而使我们可用不同的请求对客户程序进行参数化操作，以及对请求排队或记录讲求日志，以及支持可撤销的操作。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812292712.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812302023.jpg" width="610" height="218"&gt;&lt;/a&gt; &lt;p&gt;把ClientProgram对Receive.Action()的紧耦合的调用，变为对具体命令对象(ConcreteCommand对象)的调用，从而实现对多变的行为的有效管理。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812353513.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812431782.jpg" width="519" height="315"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812448619.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812459043.jpg" width="297" height="145"&gt;&lt;/a&gt; &lt;p&gt;通过ArrayList或堆栈来管理各个抽象后的行为。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/20120110181247306.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101812481254.jpg" width="469" height="304"&gt;&lt;/a&gt; &lt;p&gt;&amp;lt;完&amp;gt; &lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2318410.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318410.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318305.html</id><title type="text">C#面向对象模式设计第十四讲：Template Method 模板模式（行为型模式）</title><summary type="text">（根据MSDN WebCast相关课程整理） 变化是软件设计中永恒的主题，如何管理变化带来的复杂性？设计模式的艺术性与复杂度就在于如何分析并发现系统中的变化点和稳定点，并使用特定的设计方法来应对这种变...</summary><published>2012-01-10T09:02:00Z</published><updated>2012-01-10T09:02:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318305.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318305.html"/><content type="html">&lt;p&gt;（根据MSDN WebCast相关课程整理）&lt;/p&gt; &lt;p&gt;变化是软件设计中永恒的主题，如何管理变化带来的复杂性？设计模式的艺术性与复杂度就在于如何分析并发现系统中的变化点和稳定点，并使用特定的设计方法来应对这种变化。 &lt;p&gt;事件架构稳定，而子步骤经常改变。 &lt;p&gt;GoF：定义一个操作中的算法的框架，而将一些步骤延迟到子类中，Template Method使用是子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701326082.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701347345.jpg" width="412" height="200"&gt;&lt;/a&gt; &lt;p&gt;框架的步骤在TemplateMethod()方法中实现。这些步骤不会变动。而特定的方法步骤则在子类中实现。 &lt;p&gt;示例：如下面的汽车测试平台软件的例子，由框架和实现应用两部分组成。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701377505.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701409750.jpg" width="485" height="437"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701445666.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201201/201201101701465501.jpg" width="427" height="266"&gt;&lt;/a&gt; &lt;p&gt;&amp;lt;完&amp;gt; &lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2318305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2012/01/10/2318305.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/31/2308816.html</id><title type="text">Android中数据共享机制的实现——ContentProvider的应用从入门到精通</title><summary type="text">Android中的Content Provider可以实现在权限许可的情况下，在多个应用程序之间共享数据。Android还提供了一些主要数据类型如音频、视频、图片和私人通讯录等现成的Content provider类。当然，如果我们想让我们应用程序的数据公有化，使其它应用也可以访问，那么，我们可以实现一个自己的ContentProvider类。</summary><published>2011-12-31T07:34:00Z</published><updated>2011-12-31T07:34:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/31/2308816.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/31/2308816.html"/><content type="html">&lt;div&gt;&lt;div&gt;Android中的Content Provider可以实现在权限许可的情况下，在多个应用程序之间共享数据。Android还提供了一些主要数据类型如音频、视频、图片和私人通讯录等现成的Content provider类。当然，如果我们想让我们应用程序的数据公有化，使其它应用也可以访问，那么，我们可以实现一个自己的ContentProvider类。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;一种类型的ContentProvider只允许有一个实例，但它可以和多个不同的应用程序或进程的ContentResolver进行通信。进程间的交互就是由ContentResolver和ContentProvider一起完成的。我们可以通过getContentResolver()方法来获得 ContentResolver对象。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;数据模型：&amp;nbsp;&lt;/div&gt;&lt;div&gt;ContentProvider以数据表的形式对外暴露，其中每一行数据都有一个唯一的_ID值。每次查询数据时都会返回一个Cursor 对象。 不过使用Cursor对象获取数据前一定要先知道数据的类型。&amp;nbsp;&lt;/div&gt;&lt;div&gt;Android中通过URI来定位各种资源，每一个可以调用的资源都有一个唯一的URI，如图片，视频等。同样，ContentProvider中的每一个表也各有一个唯一的URI。ContentProvider提供的URI都是以content://开头的。在所有ContentProvider交互中都要用到URI，而且，每个ContentResolver方法的第一个参数就是URI，它告诉ContentResolver方法要访问的ContentProvider对象，以及操作的目标表。 因此，为了方便，给自定义ContentProvider中的URI指定一个专门的CONTENT_URI常量是很有必要的。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;通过Content Provider查询数据前要准备的：&amp;nbsp;&lt;/div&gt;&lt;div&gt;1，要查询数据的Provider的URI；&amp;nbsp;&lt;/div&gt;&lt;div&gt;2，要查询的数据的列名以及它们的数据类型；其中_ID和_COUNT列唯一某行数据以及总数据行数。&amp;nbsp;&lt;/div&gt;&lt;div&gt;3，如果是某一行数据，还需要知道它的ID值；如果_ID＝23 则为&amp;#8220;content://. . . ./23&amp;#8221;&amp;nbsp;&lt;/div&gt;&lt;div&gt;查询数据：&amp;nbsp;&lt;/div&gt;&lt;div&gt;可以用ContentResolver.query()方法或Activity.managedQuery()方法来获取结果Cursor。后者得到的Cursor的生命周期由Activity来管理，而不需要我们再手动关闭游标，我们还可以方便的精确控制它的加载与释放。Activity.startManagingCursor()方法可以将未受管理的游标加入到管理列表中（注：2.3版以后推荐使用getLoaderManager()得到LoaderManger对象来管理游标）stopManagingCursor(Cursor)可以停止自动管理功能。&amp;nbsp;&lt;/div&gt;&lt;div&gt;1，获取URI：&amp;nbsp;&lt;/div&gt;&lt;div&gt;ContentUris.withAppendedId()&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri.withAppendedPath()&amp;nbsp;&lt;/div&gt;&lt;div&gt;以上两个方法都可以实现将参数（ID）添加到查询URI当中去。&amp;nbsp;&lt;/div&gt;&lt;div&gt;而ContentUris.parseId(uri)方法可以获取URI中的ID部分。&lt;/div&gt;&lt;div&gt;示例：&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.provider.Contacts.People;&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.content.ContentUris;&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.net.Uri;&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.database.Cursor;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23);&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23");&amp;nbsp;&lt;/div&gt;&lt;div&gt;Cursor cur = managedQuery(myPerson, null, null, null, null);&amp;nbsp;&lt;/div&gt;&lt;div&gt;2，读取数据：&amp;nbsp;&lt;/div&gt;&lt;div&gt;private void getColumnData(Cursor cur){&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; if (cur.moveToFirst()) {&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String name;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String phoneNumber;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int nameColumn = cur.getColumnIndex(People.NAME);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int phoneColumn = cur.getColumnIndex(People.NUMBER);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String imagePath;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; do {&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Get the field values&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name = cur.getString(nameColumn);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; phoneNumber = cur.getString(phoneColumn);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Do something with the values.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } while (cur.moveToNext());&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/div&gt;&lt;div&gt;}&amp;nbsp;&lt;/div&gt;&lt;div&gt;如果是较小的二进制数据，可以直接像普通数据一样保存到表中去，但如果二进制数据量较大，且表的URI是content:URI形式的，则我们需要采用ContentResolver.openInputStream()方法来获得数据流，以便读取数据。&amp;nbsp;&lt;/div&gt;&lt;div&gt;所有数据的更改都需要调用ContentResolver的方法来完成。&amp;nbsp;&lt;/div&gt;&lt;div&gt;首先，将要更改的数据保存到ContentValues对象中，然后调用ContentResolver的相应方法面完成更新操作，示例：&amp;nbsp;&lt;/div&gt;&lt;div&gt;增加新记录：&amp;nbsp;&lt;/div&gt;&lt;div&gt;ContentValues values = new ContentValues();&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(People.NAME, "Abraham Lincoln");&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(People.STARRED, 1);&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri uri = getContentResolver().insert(People.CONTENT_URI, values);&amp;nbsp;&lt;/div&gt;&lt;div&gt;在原有记录上增加新值：&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri phoneUri = null;&amp;nbsp;&lt;/div&gt;&lt;div&gt;phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.clear();&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(People.Phones.NUMBER, "1233214567");&amp;nbsp;&lt;/div&gt;&lt;div&gt;getContentResolver().insert(phoneUri, values);&amp;nbsp;&lt;/div&gt;&lt;div&gt;其中的CONTENT_DIRECTORY是一个常量，表明这是追加的数据。&amp;nbsp;&lt;/div&gt;&lt;div&gt;如果数据是content:URI形式的二进制大对象，调用ContentResolver.openOutputStream()来保存。&amp;nbsp;&lt;/div&gt;&lt;div&gt;大二进制数据（多媒体数据）处理示例：&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.provider.MediaStore.Images.Media;&amp;nbsp;&lt;/div&gt;&lt;div&gt;import android.content.ContentValues;&amp;nbsp;&lt;/div&gt;&lt;div&gt;import java.io.OutputStream;&amp;nbsp;&lt;/div&gt;&lt;div&gt;// Save the name and description of an image in a ContentValues map. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;ContentValues values = new ContentValues(3);&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(Media.DISPLAY_NAME, "road_trip_1");&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(Media.DESCRIPTION, "Day 1, trip to Los Angeles");&amp;nbsp;&lt;/div&gt;&lt;div&gt;values.put(Media.MIME_TYPE, "image/jpeg");&amp;nbsp;&lt;/div&gt;&lt;div&gt;// Add a new record without the bitmap, but with the values just set.&amp;nbsp;&lt;/div&gt;&lt;div&gt;// insert() returns the URI of the new record.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);&amp;nbsp;&lt;/div&gt;&lt;div&gt;// Now get a handle to the file for that record, and save the data into it.&amp;nbsp;&lt;/div&gt;&lt;div&gt;// Here, sourceBitmap is a Bitmap object representing the file to save to the database.&amp;nbsp;&lt;/div&gt;&lt;div&gt;try {&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; OutputStream outStream = getContentResolver().openOutputStream(uri);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; outStream.close();&amp;nbsp;&lt;/div&gt;&lt;div&gt;} catch (Exception e) {&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Log.e(TAG, "exception while writing image", e);&amp;nbsp;&lt;/div&gt;&lt;div&gt;}&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;实现我们自己的Content Provider：&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;1，需要创建一个类并且继承ContentProvider类，并实现这个抽象类中的六个方法。&amp;nbsp;&lt;/div&gt;&lt;div&gt;public int delete(Uri uri, String selection, String[] selectionArgs){}&amp;nbsp;&lt;/div&gt;&lt;div&gt;public Uri insert(Uri uri, ContentValues values) {}&amp;nbsp;&lt;/div&gt;&lt;div&gt;public Cursor query(Uri uri, String[] projection, String selection,&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;String[] selectionArgs, String sortOrder) {} &amp;nbsp;//SQLiteCursor,MatrixCursor&amp;nbsp;&lt;/div&gt;&lt;div&gt;public int update(Uri uri, ContentValues values, String selection,&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;String[] selectionArgs) {}&amp;nbsp;&lt;/div&gt;&lt;div&gt;public boolean onCreate() {}&amp;nbsp;&lt;/div&gt;&lt;div&gt;public String getType(Uri uri) {}&amp;nbsp;&lt;/div&gt;&lt;div&gt;2，定义URI常量：&amp;nbsp;&lt;/div&gt;&lt;div&gt;public static final Uri CONTENT_URI；&amp;nbsp;&lt;/div&gt;&lt;div&gt;CONTENT_URI＝Uri.parse("content://com.example.codelab.transportationprovider");&amp;nbsp;&lt;/div&gt;&lt;div&gt;3，定义列名，不要忘记_ID列。&amp;nbsp;&lt;/div&gt;&lt;div&gt;public static String ColumnName&amp;nbsp;&lt;/div&gt;&lt;div&gt;4，如果我们的数据在是新的类型，必须在getType ()中返回这个定义好的MIME 类型，自定义类型的名称格式为：&amp;nbsp;&lt;/div&gt;&lt;div&gt;vnd.android.cursor.item/vnd.yourcompanyname.contenttype&amp;nbsp;&lt;/div&gt;&lt;div&gt;vnd.android.cursor.dir/vnd.yourcompanyname.contenttype&amp;nbsp;&lt;/div&gt;&lt;div&gt;5，当保存大二进制数据时，列名下实际存储的是content:URI，另声明一个&amp;#8220;_data&amp;#8221;列，保存文件的真实路径，以供ContentResolver.openInputStream()时访问。&amp;nbsp;&lt;/div&gt;&lt;div&gt;6，当数据发生改变时，最好还要调用ContentResolver.notifyChange()方法，来通知调用程序。&amp;nbsp;&lt;/div&gt;&lt;div&gt;7，在AndroidManifest.xml中声明ContentProvider。&amp;nbsp;&lt;/div&gt;&lt;div&gt;示例：&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;lt;provider android:name=".AutoInfoProvider"&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; android:authorities="com.example.autos.autoinfoprovider"&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; . . . /&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;lt;/provider&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;lt;provider&amp;gt;标签的属性中还可以设置ContentProvider的更多参数。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;一个完整的自定义ContentProvider及共享调用与事件侦听的例子：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;数据结构User.java：&lt;/div&gt;&lt;div&gt;Java代码&amp;nbsp;&lt;/div&gt;&lt;div&gt;1. package com.yaku.pojo; &amp;nbsp;&lt;/div&gt;&lt;div&gt;2. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3. public class User { &amp;nbsp;&lt;/div&gt;&lt;div&gt;4. &amp;nbsp; &amp;nbsp; private int id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;5. &amp;nbsp; &amp;nbsp; private String name; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6. &amp;nbsp; &amp;nbsp; private int age; &amp;nbsp;&lt;/div&gt;&lt;div&gt;7. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;8. &amp;nbsp; &amp;nbsp; public User(int id, String name, int age) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;9. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;10. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.id = id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;11. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name; &amp;nbsp;&lt;/div&gt;&lt;div&gt;12. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.age = age; &amp;nbsp;&lt;/div&gt;&lt;div&gt;13. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;14. &amp;nbsp; &amp;nbsp; public int getId() { &amp;nbsp;&lt;/div&gt;&lt;div&gt;15. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;16. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;17. &amp;nbsp; &amp;nbsp; public void setId(int id) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;18. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.id = id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;19. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;20. &amp;nbsp; &amp;nbsp; public String getName() { &amp;nbsp;&lt;/div&gt;&lt;div&gt;21. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return name; &amp;nbsp;&lt;/div&gt;&lt;div&gt;22. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;23. &amp;nbsp; &amp;nbsp; public void setName(String name) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;24. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.name = name; &amp;nbsp;&lt;/div&gt;&lt;div&gt;25. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;26. &amp;nbsp; &amp;nbsp; public int getAge() { &amp;nbsp;&lt;/div&gt;&lt;div&gt;27. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return age; &amp;nbsp;&lt;/div&gt;&lt;div&gt;28. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;29. &amp;nbsp; &amp;nbsp; public void setAge(int age) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;30. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.age = age; &amp;nbsp;&lt;/div&gt;&lt;div&gt;31. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;32. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;33. &amp;nbsp; &amp;nbsp; public String toString() { &amp;nbsp;&lt;/div&gt;&lt;div&gt;34. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "User [age=" + age + ", id=" + id + ", name=" + name + "]"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;35. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;36. } &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;数据库操作DBOpenHelper.java：&lt;/div&gt;&lt;div&gt;Java代码&lt;/div&gt;&lt;div&gt;1. package com.yaku.db; &amp;nbsp;&lt;/div&gt;&lt;div&gt;2. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3. import android.content.Context; &amp;nbsp;&lt;/div&gt;&lt;div&gt;4. import android.database.sqlite.SQLiteDatabase; &amp;nbsp;&lt;/div&gt;&lt;div&gt;5. import android.database.sqlite.SQLiteOpenHelper; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;7. public class DBOpenHelper extends SQLiteOpenHelper { &amp;nbsp;&lt;/div&gt;&lt;div&gt;8. &amp;nbsp; &amp;nbsp; private static final String DBNAME = "yaku.db"; //数据库名称 &amp;nbsp;&lt;/div&gt;&lt;div&gt;9. &amp;nbsp; &amp;nbsp; private static final int DBVER = 1;//数据库版本 &amp;nbsp;&lt;/div&gt;&lt;div&gt;10. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;11. &amp;nbsp; &amp;nbsp; public DBOpenHelper(Context context) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;12. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super(context, DBNAME, null, DBVER); &amp;nbsp;&lt;/div&gt;&lt;div&gt;13. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;14. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;15. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;16. &amp;nbsp; &amp;nbsp; public void onCreate(SQLiteDatabase db) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;17. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;18. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; db.execSQL(sql);//执行有更改的sql语句 &amp;nbsp;&lt;/div&gt;&lt;div&gt;19. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;20. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;21. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;22. &amp;nbsp; &amp;nbsp; public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;23. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; db.execSQL("DROP TABLE IF EXISTS user"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;24. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; onCreate(db); &amp;nbsp;&lt;/div&gt;&lt;div&gt;25. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;26. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;27. } &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;对外共享处理类ContentProviderUser.java：&lt;/div&gt;&lt;div&gt;Java代码&amp;nbsp;&lt;/div&gt;&lt;div&gt;1. package com.yaku.ContentProvider; &amp;nbsp;&lt;/div&gt;&lt;div&gt;2. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3. import com.yaku.db.DBOpenHelper; &amp;nbsp;&lt;/div&gt;&lt;div&gt;4. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;5. import android.content.ContentProvider; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6. import android.content.ContentUris; &amp;nbsp;&lt;/div&gt;&lt;div&gt;7. import android.content.ContentValues; &amp;nbsp;&lt;/div&gt;&lt;div&gt;8. import android.content.UriMatcher; &amp;nbsp;&lt;/div&gt;&lt;div&gt;9. import android.database.Cursor; &amp;nbsp;&lt;/div&gt;&lt;div&gt;10. import android.database.sqlite.SQLiteDatabase; &amp;nbsp;&lt;/div&gt;&lt;div&gt;11. import android.net.Uri; &amp;nbsp;&lt;/div&gt;&lt;div&gt;12. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;13. public class ContentProviderUser extends ContentProvider { &amp;nbsp;&lt;/div&gt;&lt;div&gt;14. &amp;nbsp; &amp;nbsp; private DBOpenHelper dbOpenHelper; &amp;nbsp;&lt;/div&gt;&lt;div&gt;15. &amp;nbsp; &amp;nbsp; //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码 &amp;nbsp;&lt;/div&gt;&lt;div&gt;16. &amp;nbsp; &amp;nbsp; private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); &amp;nbsp;&lt;/div&gt;&lt;div&gt;17. &amp;nbsp; &amp;nbsp; private static final int USERS = 1; &amp;nbsp;&lt;/div&gt;&lt;div&gt;18. &amp;nbsp; &amp;nbsp; private static final int USER = 2; &amp;nbsp;&lt;/div&gt;&lt;div&gt;19. &amp;nbsp; &amp;nbsp; static{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;20. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径，返回匹配码为1 &amp;nbsp;&lt;/div&gt;&lt;div&gt;21. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS); &amp;nbsp;&lt;/div&gt;&lt;div&gt;22. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径，返回匹配码为2 &amp;nbsp;&lt;/div&gt;&lt;div&gt;23. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符 &amp;nbsp;&lt;/div&gt;&lt;div&gt;24. &amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;25. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;26. &amp;nbsp; &amp;nbsp; public int delete(Uri uri, String selection, String[] selectionArgs) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;27. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;28. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count = 0; &amp;nbsp;&lt;/div&gt;&lt;div&gt;29. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (MATCHER.match(uri)) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;30. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USERS: &amp;nbsp;&lt;/div&gt;&lt;div&gt;31. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count = db.delete("user", selection, selectionArgs); &amp;nbsp;&lt;/div&gt;&lt;div&gt;32. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return count; &amp;nbsp;&lt;/div&gt;&lt;div&gt;33. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USER: &amp;nbsp;&lt;/div&gt;&lt;div&gt;34. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //ContentUris类用于获取Uri路径后面的ID部分 &amp;nbsp;&lt;/div&gt;&lt;div&gt;35. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long id = ContentUris.parseId(uri); &amp;nbsp;&lt;/div&gt;&lt;div&gt;36. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String where = "userid = "+ id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;37. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selection!=null &amp;amp;&amp;amp; !"".equals(selection)){ &amp;nbsp;&lt;/div&gt;&lt;div&gt;38. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where = selection + " and " + where; &amp;nbsp;&lt;/div&gt;&lt;div&gt;39. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;40. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count = db.delete("user", where, selectionArgs); &amp;nbsp;&lt;/div&gt;&lt;div&gt;41. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return count; &amp;nbsp;&lt;/div&gt;&lt;div&gt;42. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default: &amp;nbsp;&lt;/div&gt;&lt;div&gt;43. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;44. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;45. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;46. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;47. &amp;nbsp; &amp;nbsp; /**&amp;nbsp;&lt;/div&gt;&lt;div&gt;48. &amp;nbsp; &amp;nbsp; &amp;nbsp;* 该方法用于返回当前Url所代表数据的MIME类型。&amp;nbsp;&lt;/div&gt;&lt;div&gt;49. &amp;nbsp; &amp;nbsp; &amp;nbsp;* 如果操作的数据属于集合类型，那么MIME类型字符串应该以vnd.android.cursor.dir/开头&amp;nbsp;&lt;/div&gt;&lt;div&gt;50. &amp;nbsp; &amp;nbsp; &amp;nbsp;* 如果要操作的数据属于非集合类型数据，那么MIME类型字符串应该以vnd.android.cursor.item/开头&amp;nbsp;&lt;/div&gt;&lt;div&gt;51. &amp;nbsp; &amp;nbsp; &amp;nbsp;*/ &amp;nbsp;&lt;/div&gt;&lt;div&gt;52. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;53. &amp;nbsp; &amp;nbsp; public String getType(Uri uri) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;54. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (MATCHER.match(uri)) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;55. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USERS: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;56. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "vnd.android.cursor.dir/user"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;57. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;58. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USER: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;59. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return "vnd.android.cursor.item/user"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;60. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;61. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default: &amp;nbsp;&lt;/div&gt;&lt;div&gt;62. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;63. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;64. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;65. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;66. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;67. &amp;nbsp; &amp;nbsp; public Uri insert(Uri uri, ContentValues values) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;68. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;69. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (MATCHER.match(uri)) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;70. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USERS: &amp;nbsp;&lt;/div&gt;&lt;div&gt;71. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long rowid = db.insert("user", "name", values); &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;72. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri &amp;nbsp;&lt;/div&gt;&lt;div&gt;73. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.getContext().getContentResolver().notifyChange(uri, null); &amp;nbsp;&lt;/div&gt;&lt;div&gt;74. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return insertUri; &amp;nbsp;&lt;/div&gt;&lt;div&gt;75. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;76. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default: &amp;nbsp;&lt;/div&gt;&lt;div&gt;77. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;78. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;79. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;80. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;81. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;82. &amp;nbsp; &amp;nbsp; public boolean onCreate() { &amp;nbsp;&lt;/div&gt;&lt;div&gt;83. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.dbOpenHelper = new DBOpenHelper(this.getContext()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;84. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false; &amp;nbsp;&lt;/div&gt;&lt;div&gt;85. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;86. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;87. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;88. &amp;nbsp; &amp;nbsp; public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, &amp;nbsp;&lt;/div&gt;&lt;div&gt;89. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String sortOrder) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;90. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;91. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (MATCHER.match(uri)) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;92. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USERS: &amp;nbsp;&lt;/div&gt;&lt;div&gt;93. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return db.query("user", projection, selection, selectionArgs, null, null, sortOrder); &amp;nbsp;&lt;/div&gt;&lt;div&gt;94. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USER: &amp;nbsp;&lt;/div&gt;&lt;div&gt;95. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long id = ContentUris.parseId(uri); &amp;nbsp;&lt;/div&gt;&lt;div&gt;96. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String where = "userid = "+ id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;97. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selection!=null &amp;amp;&amp;amp; !"".equals(selection)){ &amp;nbsp;&lt;/div&gt;&lt;div&gt;98. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where = selection + " and " + where; &amp;nbsp;&lt;/div&gt;&lt;div&gt;99. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;100. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return db.query("user", projection, where, selectionArgs, null, null, sortOrder); &amp;nbsp;&lt;/div&gt;&lt;div&gt;101. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default: &amp;nbsp;&lt;/div&gt;&lt;div&gt;102. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;103. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;104. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;105. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;106. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;107. &amp;nbsp; &amp;nbsp; public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;108. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;109. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count = 0; &amp;nbsp;&lt;/div&gt;&lt;div&gt;110. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (MATCHER.match(uri)) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;111. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USERS: &amp;nbsp;&lt;/div&gt;&lt;div&gt;112. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count = db.update("person", values, selection, selectionArgs); &amp;nbsp;&lt;/div&gt;&lt;div&gt;113. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return count; &amp;nbsp;&lt;/div&gt;&lt;div&gt;114. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case USER: &amp;nbsp;&lt;/div&gt;&lt;div&gt;115. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long id = ContentUris.parseId(uri); &amp;nbsp;&lt;/div&gt;&lt;div&gt;116. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String where = "userid = "+ id; &amp;nbsp;&lt;/div&gt;&lt;div&gt;117. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(selection!=null &amp;amp;&amp;amp; !"".equals(selection)){ &amp;nbsp;&lt;/div&gt;&lt;div&gt;118. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where = selection + " and " + where; &amp;nbsp;&lt;/div&gt;&lt;div&gt;119. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;120. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count = db.update("user", values, where, selectionArgs); &amp;nbsp;&lt;/div&gt;&lt;div&gt;121. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return count; &amp;nbsp;&lt;/div&gt;&lt;div&gt;122. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default: &amp;nbsp;&lt;/div&gt;&lt;div&gt;123. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;124. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;125. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;126. } &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;单元测试类（在另一个应用中）：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Java代码&lt;/div&gt;&lt;div&gt;1. package com.yaku.ContentProvider; &amp;nbsp;&lt;/div&gt;&lt;div&gt;2. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3. import android.content.ContentResolver; &amp;nbsp;&lt;/div&gt;&lt;div&gt;4. import android.content.ContentValues; &amp;nbsp;&lt;/div&gt;&lt;div&gt;5. import android.database.Cursor; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6. import android.net.Uri; &amp;nbsp;&lt;/div&gt;&lt;div&gt;7. import android.test.AndroidTestCase; &amp;nbsp;&lt;/div&gt;&lt;div&gt;8. import android.util.Log; &amp;nbsp;&lt;/div&gt;&lt;div&gt;9. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;10. /**&amp;nbsp;&lt;/div&gt;&lt;div&gt;11. &amp;nbsp;* 对ContentProvider工程中的ContentProviderActivity进行单元测试&amp;nbsp;&lt;/div&gt;&lt;div&gt;12. &amp;nbsp;*/ &amp;nbsp;&lt;/div&gt;&lt;div&gt;13. public class ContentProviderActivityTest extends AndroidTestCase { &amp;nbsp;&lt;/div&gt;&lt;div&gt;14. &amp;nbsp; &amp;nbsp; private static final String TAG = "ContentProvider"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;15. &amp;nbsp; &amp;nbsp; //往内容提供者添加数据 &amp;nbsp;&lt;/div&gt;&lt;div&gt;16. &amp;nbsp; &amp;nbsp; public void testInsert() throws Throwable{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;17. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = this.getContext().getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;18. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;19. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentValues values = new ContentValues(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;20. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; values.put("name", "道长"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;21. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; values.put("age", 86); &amp;nbsp;&lt;/div&gt;&lt;div&gt;22. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri uri = contentResolver.insert(insertUri, values); &amp;nbsp;&lt;/div&gt;&lt;div&gt;23. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.i(TAG, uri.toString()); &amp;nbsp;&lt;/div&gt;&lt;div&gt;24. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;25. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;26. &amp;nbsp; &amp;nbsp; //更新内容提供者中的数据 &amp;nbsp;&lt;/div&gt;&lt;div&gt;27. &amp;nbsp; &amp;nbsp; public void testUpdate() throws Throwable{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;28. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = this.getContext().getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;29. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;30. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentValues values = new ContentValues(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;31. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; values.put("name", "青眉道长"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;32. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; contentResolver.update(updateUri, values, null, null); &amp;nbsp;&lt;/div&gt;&lt;div&gt;33. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;34. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;35. &amp;nbsp; &amp;nbsp; //从内容提供者中删除数据 &amp;nbsp;&lt;/div&gt;&lt;div&gt;36. &amp;nbsp; &amp;nbsp; public void testDelete() throws Throwable{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;37. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = this.getContext().getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;38. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;39. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; contentResolver.delete(deleteUri, null, null); &amp;nbsp;&lt;/div&gt;&lt;div&gt;40. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;41. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;42. &amp;nbsp; &amp;nbsp; //获取内容提供者中的数据 &amp;nbsp;&lt;/div&gt;&lt;div&gt;43. &amp;nbsp; &amp;nbsp; public void testFind() throws Throwable{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;44. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = this.getContext().getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;45. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;46. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;47. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(cursor.moveToNext()){ &amp;nbsp;&lt;/div&gt;&lt;div&gt;48. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int id = cursor.getInt(cursor.getColumnIndex("userid")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;49. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String name = cursor.getString(cursor.getColumnIndex("name")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;50. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int age = cursor.getInt(cursor.getColumnIndex("age")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;51. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age); &amp;nbsp;&lt;/div&gt;&lt;div&gt;52. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;53. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;54. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;55. } &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;监听数据的变化：&lt;/div&gt;&lt;div&gt;Java代码&lt;/div&gt;&lt;div&gt;1. &amp;lt;span style="font-size: medium;"&amp;gt;package com.yaku.ContentProvider; &amp;nbsp;&lt;/div&gt;&lt;div&gt;2. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3. import android.content.ContentResolver; &amp;nbsp;&lt;/div&gt;&lt;div&gt;4. import android.content.ContentValues; &amp;nbsp;&lt;/div&gt;&lt;div&gt;5. import android.database.Cursor; &amp;nbsp;&lt;/div&gt;&lt;div&gt;6. import android.net.Uri; &amp;nbsp;&lt;/div&gt;&lt;div&gt;7. import android.test.AndroidTestCase; &amp;nbsp;&lt;/div&gt;&lt;div&gt;8. import android.util.Log; &amp;nbsp;&lt;/div&gt;&lt;div&gt;9. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;10. /**&amp;nbsp;&lt;/div&gt;&lt;div&gt;11. &amp;nbsp;* 监听数据变化&amp;nbsp;&lt;/div&gt;&lt;div&gt;12. &amp;nbsp;*/ &amp;nbsp;&lt;/div&gt;&lt;div&gt;13. public class OtherContentProviderTest extends AndroidTestCase { &amp;nbsp;&lt;/div&gt;&lt;div&gt;14. &amp;nbsp; &amp;nbsp; private static final String TAG = "OtherContentProvider"; &amp;nbsp;&lt;/div&gt;&lt;div&gt;15. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;16. &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;17. &amp;nbsp; &amp;nbsp; public void onCreate(Bundle savedInstanceState) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;18. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super.onCreate(savedInstanceState); &amp;nbsp;&lt;/div&gt;&lt;div&gt;19. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setContentView(R.layout.main); &amp;nbsp;&lt;/div&gt;&lt;div&gt;20. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;21. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;22. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = this.getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;23. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //对指定uri进行监听，如果该uri代表的数据发生变化，就会调用PersonObserver中的onChange() &amp;nbsp;&lt;/div&gt;&lt;div&gt;24. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler())); &amp;nbsp;&lt;/div&gt;&lt;div&gt;25. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;26. &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;27. &amp;nbsp; &amp;nbsp; private final class PersonObserver extends ContentObserver{ &amp;nbsp;&lt;/div&gt;&lt;div&gt;28. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public PersonObserver(Handler handler) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;29. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; super(handler); &amp;nbsp;&lt;/div&gt;&lt;div&gt;30. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;31. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;32. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override &amp;nbsp;&lt;/div&gt;&lt;div&gt;33. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public void onChange(boolean selfChange) { &amp;nbsp;&lt;/div&gt;&lt;div&gt;34. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ContentResolver contentResolver = getContentResolver(); &amp;nbsp;&lt;/div&gt;&lt;div&gt;35. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;36. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc"); &amp;nbsp;&lt;/div&gt;&lt;div&gt;37. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(cursor.moveToNext()){ &amp;nbsp;&lt;/div&gt;&lt;div&gt;38. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int id = cursor.getInt(cursor.getColumnIndex("userid")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;39. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String name = cursor.getString(cursor.getColumnIndex("name")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;40. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int age = cursor.getInt(cursor.getColumnIndex("age")); &amp;nbsp;&lt;/div&gt;&lt;div&gt;41. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age); &amp;nbsp;&lt;/div&gt;&lt;div&gt;42. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;43. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;44. &amp;nbsp; &amp;nbsp; } &amp;nbsp;&lt;/div&gt;&lt;div&gt;45. } &amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;《完》&lt;/div&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2308816.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/31/2308816.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306485.html</id><title type="text">C#面向对象设计模式第十三讲：Proxy 代理模式（结构型模式）</title><summary type="text">（根据MSDN Webcast 相关课程整理） 直接与间接： 对于复杂的系统，我们常常在使用时添加一个中间层，从而屏蔽一些不常用的功能，或简化一些常用功能等，从而达到用简单灵活的方法满足特定的需要的...</summary><published>2011-12-29T09:43:00Z</published><updated>2011-12-29T09:43:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306485.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306485.html"/><content type="html">&lt;p&gt;（根据MSDN Webcast 相关课程整理）&lt;/p&gt; &lt;p&gt;直接与间接：  &lt;p&gt;对于复杂的系统，我们常常在使用时添加一个中间层，从而屏蔽一些不常用的功能，或简化一些常用功能等，从而达到用简单灵活的方法满足特定的需要的目的。  &lt;p&gt;如：A访问B时，每访问一次B，就需要调用一次B对象，由于B对象的复杂性，调用开销较大，尤其是B处于分布式应用当中时。另一方面，直接调用复杂的对象，暴露了过多的A不需要的接口，造成不安全性。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742435056.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742431010.jpg" width="378" height="107"&gt;&lt;/a&gt;  &lt;p&gt;加是中间层C以后，简化了B的接口与复杂性，使得A对C的访问简单灵活安全， A对资源的访问也不一定需要直接连接到B，从而无关分布式访问细节。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742448601.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742458384.jpg" width="378" height="116"&gt;&lt;/a&gt;  &lt;p&gt;实例：最早的计算机操作员直接和底层硬件打交道，操作十分复杂；后果，人们设计了操作系统，将计算机底层硬件操作的复杂性于以屏蔽，并帮助我们自动管理了内存，CPU等资源，大大简化了操作的复杂性。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/20111229174246468.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742518488.jpg" width="447" height="172"&gt;&lt;/a&gt;  &lt;p&gt;示例：  &lt;p&gt;跨国公司人力管理系统中，员工信息存放在公司总部的服务器上，而运行于国外分部的HR系统如果如何处理这种情况呢？  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742538097.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742547149.jpg" width="447" height="213"&gt;&lt;/a&gt;  &lt;p&gt;接口屏蔽了部分功能。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291742564806.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/20111229174257511.jpg" width="610" height="213"&gt;&lt;/a&gt;  &lt;p&gt;代理类实现了接口功能，并采用SOAP方法调用了服务器上的对象。  &lt;p&gt;《完》&lt;/p&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2306485.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306485.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306349.html</id><title type="text">C#面向对象设计模式第十二讲：Flyweight 享元模式（结构型模式）</title><summary type="text">（根据MSDN Webcast 相关课程整理） 面向对象很好的解决了系统抽象的问题，同是不会损害系统的性能。但是在某些特殊应用中，由于对象的数量太大，采用面向对象会给系统带来难以承受的内在开销。 比如...</summary><published>2011-12-29T08:29:00Z</published><updated>2011-12-29T08:29:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306349.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306349.html"/><content type="html">&lt;p&gt;（根据MSDN Webcast 相关课程整理）&lt;/p&gt; &lt;p&gt;面向对象很好的解决了系统抽象的问题，同是不会损害系统的性能。但是在某些特殊应用中，由于对象的数量太大，采用面向对象会给系统带来难以承受的内在开销。 &lt;p&gt;比如：图形应用中的图元等对象，字处理软件中的字符对象等。 &lt;p&gt;如果采用纯粹对方案的问题在于大量细粒度的对象会很快充斥在系统中，从而带来很高的运行代价。这时候，就应该考虑采用享元模式来处理问题。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/20111229162907136.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629094238.jpg" width="612" height="227"&gt;&lt;/a&gt; &lt;p&gt;GoF：运用共享技术处理大量细粒度对象。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629117991.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629127632.jpg" width="423" height="243"&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629145912.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629192819.jpg" width="423" height="227"&gt;&lt;/a&gt; &lt;p&gt;采用享元模式设计思想，将重复的Font对象共享出来： &lt;p&gt;也可以将Font对象封装成属性来做。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629231263.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112291629257317.jpg" width="496" height="327"&gt;&lt;/a&gt; &lt;p&gt;Flyweight模式采用共享的方法，解决了倍乘对象带来的系统资源与性能的开销压力的问题。 &lt;p&gt;&amp;lt;完&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2306349.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/29/2306349.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/28/2304989.html</id><title type="text">Android应用程序四种数据存取方法总结</title><summary type="text">1，采用Shared Preferences： 一句话实现保存Android应用程序配置信息： 保存：getPreferences(Activity.MODE_PRIVATE).edit().putString(strKey,strValue).commit(); 读取：strValue=getPreferences(Activity.MODE_PRIVATE).edit().getString(strKey); 注：应用内不同Activity之间的配置数据共享使用getSharedPreferences()。 2，采用File： Files 数据存储主要是使用 Proper...</summary><published>2011-12-28T08:25:00Z</published><updated>2011-12-28T08:25:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/28/2304989.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/28/2304989.html"/><content type="html">&lt;div&gt; 	 	 	   &lt;p&gt;&lt;strong&gt;1，采用Shared Preferences：&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;一句话实现保存Android应用程序配置信息：&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;保存：getPreferences(Activity.MODE_PRIVATE).edit().putString(strKey,strValue).commit();&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;读取：strValue=getPreferences(Activity.MODE_PRIVATE).edit().getString(strKey);&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;注：应用内不同Activity之间的配置数据共享使用getSharedPreferences()。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2，采用File：&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;Files 数据存储主要是使用 Properties 并配合 FileInputStream或者FileOutputStream对文件写入操作。&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;保存：&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;FileOutputStream stream=this.openFileOutput(FileName, Context.MODE_PRIVATE);&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;new Properties().put(strKey,strValue).store(stream, "");&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;读取：&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;FileInputStream stream =this.openFileInput(FileName);  &lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;strValue=String.valueOf(new Properties().load(stream).getProperty(strKey));&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;注：采用 Properties的setProperty()方法，可以将键值对打包，最后调用storeXXX方法写入文件。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;3，采用网络空间：(略)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;4，采用SQLite数据库：&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;A,SQLite&lt;/span&gt;预备知识：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;默认数据库路径：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;data/data/myPackage/databases/ &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;打开数据库：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;sqlite3 dbName &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;操作：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;.help &lt;/span&gt;帮助；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;.table &lt;/span&gt;查看所有表&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;每一句&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;Sql&lt;/span&gt;语句结束都需要分号&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;B,JDBC&lt;/span&gt;驱动程序：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	Class.forName("org.sqlite.JDBC"); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	Connection conn = DriverManager.getConnection("jdbc:sqlite:filename"); //filename&lt;/span&gt;为你的&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLite&lt;/span&gt;数据名称&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;C,&lt;/span&gt;使用&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLiteOpenHelper&lt;/span&gt;操作数据库：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;获得数据库实例：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	getReadableDatabase()&lt;/span&gt;获得可读的&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLiteDatabase &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	getWritableDatabase() &lt;/span&gt;获得可写的&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLiteDatabase &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLiteOpenHelper&lt;/span&gt;子类中需要重写的常用事件：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	onCreate(SQLiteDatabase) &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;封装的&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;DBHelp&lt;/span&gt;类，实现对数据库的操作：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;public class DBHelp extends SQLiteOpenHelper { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	public DBHelp(Context context, String name, CursorFactory factory, &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;int version) { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;        &lt;span style="font-weight: normal"&gt;super(context, name, factory, version);         &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;    &lt;span style="font-weight: normal"&gt;} &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt; &lt;span style="font-weight: normal"&gt;@Override &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;    &lt;span style="font-weight: normal"&gt;public void onCreate(SQLiteDatabase db) { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;db.execSQL(createTableSQL); // &lt;/span&gt;执行&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQL &lt;/span&gt;需要使用&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;execSQL&lt;/span&gt;（）&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;｝&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;@Override &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;    &lt;span style="font-weight: normal"&gt;public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;｝&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;@Override &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;    &lt;span style="font-weight: normal"&gt;public void onOpen(SQLiteDatabase db) { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;｝&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	InsertData() &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	UpdateData()  &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	DeleteData()  &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	rawQuery() &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	query()  &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;｝&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;创建并打开数据库：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	SQLiteDatabase db = new DBHelp(SQLiteActivity.this).getReadableDatabase(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;添加数据：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	DBHelp dbHelp = new DBHelp(SQLiteActivity.this); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt; &lt;span style="font-weight: normal"&gt;	SQLiteDatabase db = dbHelp.getWritableDatabase(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	ContentValues contentValues = new ContentValues(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	contentValues.put("sName", txtName.getText().toString()); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	contentValues.put("sSex", "&lt;/span&gt;男&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;"); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	dbHelp.InsertData(db, contentValues)&lt;/span&gt;；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;修改数据：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	DBHelp dbHelp = new DBHelp(SQLiteActivity.this); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	SQLiteDatabase db = dbHelp.getWritableDatabase(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	ContentValues contentValues = new ContentValues(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt; &lt;span style="font-weight: normal"&gt;	contentValues.put("sName", txtsName.getText().toString()); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	String whereClause = "sid=?"; //&lt;/span&gt;要修改数据的条件 值用？占位符&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	String[] whereArgs = new String[]{txtsID.getText().toString()}; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	dbHelp.UpdateData(db, contentValues, whereClause, whereArgs)&lt;/span&gt;；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;删除数据：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	DBHelp dbHelp = new DBHelp(SQLiteActivity.this); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	SQLiteDatabase db = dbHelp.getWritableDatabase(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	String whereClause = "sid=?"; //&lt;/span&gt;要删除数据的条件 值用？占位符&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	String[] whereArgs = new String[]{txtID.getText().toString()}; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	dbHelp.DeleteData(db, whereClause, whereArgs)&lt;/span&gt;；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;查询数据：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	Cursor cur =db.rawQuery(&amp;#8220;SELECT * FROM Student WHERE sid=1 AND sname=&amp;#8216;zhangsan'", null); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	Cursor cur =db.rawQuery(...) &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;每一个&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;rawQuery()&lt;/span&gt;或&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;query()&lt;/span&gt;都会返回一个&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SQLite&lt;/span&gt;数据库&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;Cursor&lt;/span&gt;。&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;操作游标：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过使用 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;getCount() &lt;/span&gt;方法得到结果集中有多少记录；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;moveToFirst(), moveToNext(), &lt;/span&gt;和 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;isAfterLast() &lt;/span&gt;方法遍历所有记录；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;getColumnNames() &lt;/span&gt;得到字段名；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;getColumnIndex() &lt;/span&gt;转换成字段号；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;getString()&lt;/span&gt;，&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;getInt() &lt;/span&gt;等方法得到给定字段当前记录的值；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;requery() &lt;/span&gt;方法重新执行查询得到游标；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	&lt;/span&gt;通过 &lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;close() &lt;/span&gt;方法释放游标资源；&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SimpleCursorAdapter&lt;/span&gt;：和游标关联，绑定到&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;ListView&lt;/span&gt;以呈现数据&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;,&lt;/span&gt;前提条件，表中有&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;_id&lt;/span&gt;列，并且是主键。&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	SimpleCursorAdapter simple = new SimpleCursorAdapter(SQLiteActivity.this, android.R.layout.simple_list_item_1, cur, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2}); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	studentList.setAdapter(simple); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;当&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;_id&lt;/span&gt;不是主键时，先从游标是把数据取出来，然后采用&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;SimpleAdapter&lt;/span&gt;来呈现数据：&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	ArrayList&amp;lt;HashMap&amp;lt;String, Object&amp;gt;&amp;gt; students = new ArrayList&amp;lt;HashMap&amp;lt;String,Object&amp;gt;&amp;gt;(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	HashMap&amp;lt;String, Object&amp;gt; hs ; &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	for (cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) { &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;hs = new HashMap&amp;lt;String, Object&amp;gt;(); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;hs.put("sID", cur.getInt(cur.getColumnIndex("sid"))); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;hs.put("sName", cur.getString(cur.getColumnIndex("sName"))); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;hs.put("sSex", cur.getString(cur.getColumnIndex("sSex"))); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;            &lt;span style="font-weight: normal"&gt;students.add(hs); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	} &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	SimpleAdapter sim = new SimpleAdapter(SQLiteActivity.this, students, android.R.layout.simple_list_item_1, new String[]{"sName","sSex"}, new int[]{android.R.id.text1,android.R.id.text2}); &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; "&gt;&lt;strong&gt;&lt;span style="font-weight: normal"&gt;	studentList.setAdapter(sim);&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;《完》&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2304989.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/28/2304989.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303828.html</id><title type="text">C#面向对象设计模式第十一讲：Facade 外观模式（结构型模式）</title><summary type="text">（根据MSDN Webcast相关课程整理） 先看以下实例： 左边的方案中客户调用程序与子系统内部的具体实现类具有较多的耦合与交互。显然是不理想的设计方案。随着外部客户程序和各子系统的演化，这种过多的...</summary><published>2011-12-27T09:42:00Z</published><updated>2011-12-27T09:42:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303828.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303828.html"/><content type="html">&lt;p&gt;（根据MSDN Webcast相关课程整理）&lt;/p&gt; &lt;p&gt;先看以下实例： &lt;p&gt;左边的方案中客户调用程序与子系统内部的具体实现类具有较多的耦合与交互。显然是不理想的设计方案。随着外部客户程序和各子系统的演化，这种过多的耦合将面临居多变化的挑战。 &lt;p&gt;再看右边的方案，外部客户程序不再直接与子系统内部类直接交互，而是通过一个Façade接口实现内外系统之间的关联，大大降低了系统的耦合性。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741264660.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741271761.jpg" width="646" height="206"&gt;&lt;/a&gt; &lt;p&gt;GoF：为子系统中的一组接口提供一个一致的界面，Facade模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741325288.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741345519.jpg" width="619" height="211"&gt;&lt;/a&gt; &lt;p&gt;平常我们讲的接口不是指特定的Interface，而是指类暴露出来的公有方法。这些方法可以和外界接待交互。 &lt;p&gt;示例：坦克车包含了若干个子系统，如车轮系统，控制系统，引擎系统等等。但通常，我们只需要提供一个统一的操作界面，让驾驶员使用就可以啦，而不需要他去了解各子系统具体的工作方式。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741399885.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/luckeryin/201112/201112271741421917.jpg" width="380" height="445"&gt;&lt;/a&gt; &lt;p&gt;这里我们通过internal关键字来实现子系统的隐藏，而采用组合的方法把各子系统添加到Façade中来，并暴露公有的操作方法供外界调用。 &lt;p&gt;Facade模式更多的是运用于架构层级的设计，优化外界与各子系统之间的耦合关系。 &lt;p&gt;&amp;lt;完&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2303828.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303828.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303619.html</id><title type="text">7大排序算法小结</title><summary type="text">1,快速排序 : 快速排序具有神奇的排序效率，平均状况下它的时间复杂度为Ο(nlogn)，但它通常明显比其他Ο(nlogn)的算法更快。快速排序概括起来三步：找基准，通常为序列首尾元素；与基准比较后左...</summary><published>2011-12-27T07:26:00Z</published><updated>2011-12-27T07:26:00Z</updated><author><name>Lucker</name><uri>http://www.cnblogs.com/luckeryin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303619.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303619.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1,快速排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;快速排序具有神奇的排序效率，平均状况下它的时间复杂度为Ο(nlogn)，但它通常明显比其他Ο(nlogn)的算法更快。快速排序概括起来三步：找基准，通常为序列首尾元素；与基准比较后左右分区；递归。&lt;br&gt;Java代码：&lt;br&gt;public void QuickSort(int[] array )&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0 ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int j = array.length - 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int k = array[0];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(i != j)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(array[j] &amp;gt; k)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j--;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int temp = k;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k = array[j];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[j] = temp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (array[i] &amp;lt; k)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int temp1= k;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k = array[i];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[i] = temp1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt; &lt;p&gt;&lt;strong&gt;2,归并排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;归并排序采用分治法递归实现，单次排序实现将两个有序序序列合并成一个。步骤为：申请大小为两个已经排序序列之和的空间；设定两个指针分别指向序列的起始位置；比较两个指针处的元素，小的放入空间，并移动指针；重复前一步直到某一指针达到序列尾；将另一序列剩下的所有元素直接复制到合并序列尾；递归。&lt;br&gt;C语言实现：&lt;br&gt;void Merge(int *R,int low,int m,int high)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i=low,j=m+1,p=0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int *R1; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; R1=(int *)malloc((high-low+1)*sizeof(int));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!R1) return; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(i&amp;lt;=m&amp;amp;&amp;amp;j&amp;lt;=high) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R1[p++]=(R[i]&amp;lt;=R[j])?R[i++]:R[j++];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(i&amp;lt;=m) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R1[p++]=R[i++];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(j&amp;lt;=high) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R1[p++]=R[j++];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(p=0,i=low;i&amp;lt;=high;p++,i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R[i]=R1[p];&lt;br&gt;}&lt;br&gt;void MergeSort(int R[],int low,int high)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int mid;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(low&amp;lt;high)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mid=(low+high)/2;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MergeSort(R,low,mid);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MergeSort(R,mid+1,high);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Merge(R,low,mid,high);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt; &lt;p&gt;&lt;strong&gt;3,堆排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;堆排序，先建一个大顶堆，将堆顶元素与序列中最后一个记录交换，然后重新将它调整为一个大顶堆，再将堆顶记录和第 n-1 个记录交换，如此反复直至排序结束。&lt;br&gt;大顶堆是一棵任一非叶结点的关键字均不小于其左右孩子(若存在)结点的关键字的完全二叉树&lt;br&gt;C语言实现：&lt;br&gt;// array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度&lt;br&gt;void HeapAdjust(int array[], int i, int nLength)//本函数功能是：根据数组array构建大根堆&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nChild;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nTemp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (nTemp = array[i]; 2 * i + 1 &amp;lt; nLength; i = nChild)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 子结点的位置=2*(父结点位置）+ 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nChild = 2 * i + 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 得到子结点中较大的结点&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nChild &amp;lt; nLength - 1 &amp;amp;&amp;amp; array[nChild + 1] &amp;gt; array[nChild])&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++nChild;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nTemp &amp;lt; array[nChild])&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[i]= array[nChild];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else　// 否则退出循环&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 最后把需要调整的元素值放到合适的位置&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[nChild]= nTemp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;// 堆排序算法&lt;br&gt;void HeapSort(int array[], int length)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = length / 2 - 1; i &amp;gt;= 0; --i)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeapAdjust(array, i, length);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = length - 1; i &amp;gt; 0; --i)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 把第一个元素和当前的最后一个元素交换,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Swap(&amp;amp;array[0], &amp;amp;array[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeapAdjust(array, 0, i);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt; &lt;p&gt;&lt;strong&gt;4,选择排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;选择排序简单直观。其原理是：首先在未排序序列中找到最小元素，存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找最小元素，放到排序序列末尾。以此类推，直到所有元素均排序完毕。&lt;br&gt;Java语言实现：&lt;br&gt;void SelectSort(SeqList R)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i,j,k;//最小关键字所在的位置&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=1;i&amp;lt;n;i++){//做第i趟排序(1≤i≤n-1)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k=i；&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(j=i+1;j&amp;lt;=n;j++) //在当前无序区R[j..n]中选key最小的记录R[k]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(R[j].key&amp;lt;R[k].key)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; k=j; //k记下目前找到的最小关键字所在的位置&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(k!=i){ //交换R[i]和R[k]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; R[0]=R[i];R[i]=R[k];R[k]=R[0]; //R[0]作暂存单元&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } //endif&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } //endfor&lt;br&gt;} //SeleetSort&lt;br&gt; &lt;p&gt;&lt;strong&gt;5,冒泡排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;冒泡排序是通过依次比较相邻两元素的大小，若逆序则交换，这样一趟将最大的那个先找出来，然后再对剩下的队列进行下一趟排序直到没有发生交换为完成。&lt;br&gt;C语言实现：&lt;br&gt;void bubble_sort(int array[],int n)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i,j,flag,temp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; n-1; i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 1;//交换标志&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(j = 0; j &amp;lt; n-i-1; j++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(array[j] &amp;gt; array[j+1])&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = array[j];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[j] = array[j+1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[j+1] = temp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt; &lt;p&gt;&lt;strong&gt;6,插入排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;插入排序，先在待排序列中选择第一个元素，在排序序列中从后至前比较，当先元素大于序列中元素时插入。然后重复以前步骤。&lt;br&gt;void InsertSort(char array[],unsigned int n)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i,j;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int temp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=1;i&amp;lt;n;i++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = array[i];//store the original sorted array in temp&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(j=i ; j&amp;gt;0 &amp;amp;&amp;amp; temp &amp;lt; array[j-1] ; j--)//compare the new array with temp&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[j]=array[j-1];//all larger elements are moved one pot to the right&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[j]=temp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt; &lt;p&gt;&lt;strong&gt;7,希尔排序 :&lt;/strong&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;希尔排序是一种分组插入排序算法，它采用缩小增量方法对原序列进行分组，在组内实行直接插入排序直到增量＝1 。增量d的取法：d1&amp;lt;n且避免序列中的值(尤其是相邻的值)互为倍数&lt;br&gt;C＃语言实现：&lt;br&gt;public void Shell_Sort(int[] list)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int inc;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (inc = 1; inc &amp;lt;= list.Length / 9; inc = 3 * inc + 1) ;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (; inc &amp;gt; 0; inc /= 3)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = inc + 1; i &amp;lt;= list.Length; i += inc)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int t = list[i - 1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int j = i;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((j &amp;gt; inc) &amp;amp;&amp;amp; (list[j - inc - 1] &amp;gt; t))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[j - 1] = list[j - inc - 1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j -= inc;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[j - 1] = t;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;p&gt;&amp;lt;完&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/luckeryin/aggbug/2303619.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luckeryin/archive/2011/12/27/2303619.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
