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

<channel>
	<title>诗意代码 - PoemCode &#187; Widget</title>
	<atom:link href="http://www.poemcode.net/tag/widget/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.poemcode.net</link>
	<description>These codes, As beautiful as poetry!</description>
	<lastBuildDate>Sun, 05 Feb 2012 13:10:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>探索Android应用开发（三）</title>
		<link>http://www.poemcode.net/2009/03/android_develop_3/</link>
		<comments>http://www.poemcode.net/2009/03/android_develop_3/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 13:47:13 +0000</pubDate>
		<dc:creator>Xu Haojie</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Widget]]></category>

		<guid isPermaLink="false">http://www.poemcode.net/?p=173</guid>
		<description><![CDATA[<div class="wp-caption alignright" style="width: 76px"><img class="size-full wp-image-521" title="Android" src="http://www.poemcode.net/wp-content/uploads/2009/09/android.gif" alt="Android" width="76" height="90" /></div> 
Spinner是一种widget，允许用户从一组选项中进行选中。这和下拉列表非常相像。在从数据库查询数据后，取出结果，然后根据结果选中Spinner的选项时，遇到了一个棘手的问题，异常如下：]]></description>
			<content:encoded><![CDATA[<div id="attachment_19" class="wp-caption alignleft" style="width: 310px"><img class="size-full wp-image-19" title="android" src="http://www.poemcode.net/wp-content/uploads/2008/12/android.jpeg" alt="android" width="300" height="220" /><p class="wp-caption-text">android</p></div>
<p><strong>学习目标：</strong></p>
<ol>
<li>从下拉框中选中类型；</li>
<li>从数据库查询结果；</li>
</ol>
<p><strong>学习目的：</strong></p>
<ol>
<li>掌握Spinner的使用；</li>
<li>掌握数据库操作；</li>
</ol>
<p><strong>学习收获：</strong></p>
<p>Spinner是一种widget，允许用户从一组选项中进行选中。这和下拉列表非常相像。在从数据库查询数据后，取出结果，然后根据结果选中Spinner的选项时，遇到了一个棘手的问题，异常如下：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">ERROR/AndroidRuntime(536): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.poemcode.android/net.poemcode.android.PurseEdit}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2141)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2157)
    at android.app.ActivityThread.access$1800(ActivityThread.java:112)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581)
    at android.os.Handler.dispatchMessage(Handler.java:88)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3739)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:559)
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:172)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    at net.poemcode.android.PurseEdit.onCreate(PurseEdit.java:41)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
    ... 11 more</pre></div></div>

<p>于是，从获取Cursour的方法开始入手，如下代码所示：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Cursor</span> fetch<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span> rowId<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Cursor</span> cursor <span style="color: #339933;">=</span> db.<span style="color: #006633;">query</span><span style="color: #009900;">&#40;</span>DATABASE_TABLE, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span>KEY_ROWID, KEY_TYPE, KEY_MONEY<span style="color: #009900;">&#125;</span>, KEY_ROWID <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;=?&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #003399;">String</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>rowId<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span>, <span style="color: #000066; font-weight: bold;">null</span>, <span style="color: #000066; font-weight: bold;">null</span>, <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> cursor<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>然后调用方式如下：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Cursor</span> cursor <span style="color: #339933;">=</span> adapter.<span style="color: #006633;">fetch</span><span style="color: #009900;">&#40;</span>mRowId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">int</span> typeIndex <span style="color: #339933;">=</span> cursor.<span style="color: #006633;">getColumnIndexOrThrow</span><span style="color: #009900;">&#40;</span>PurseDbAdapter.<span style="color: #006633;">KEY_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> typeValue <span style="color: #339933;">=</span> cursor.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>typeIndex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Log.<span style="color: #006633;">v</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PurseEdit&quot;</span>, <span style="color: #0000ff;">&quot;index of column of type is &quot;</span> <span style="color: #339933;">+</span> typeIndex <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;, value is&quot;</span> <span style="color: #339933;">+</span> typeValue<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>这样每次取值的时候，就会发生上面的异常，对比官方示例的代码，发现了原因所在，即在调用query方法以后，如果Cursor不为null，应该首先把调用moveToFirst方法。如下所示：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cursor <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    cursor.<span style="color: #006633;">moveToFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>从 XML配置文件中读出数组，采用以下方法：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Resources res <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getResources</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> typeArr <span style="color: #339933;">=</span> res.<span style="color: #006633;">getStringArray</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">array</span>.<span style="color: #006633;">types</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.poemcode.net/2009/03/android_develop_3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

