Activity01.java
- Java code
package com.yarin.android.Examples_03_02; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.PhoneLookup; import android.widget.TextView; public class Activity01 extends Activity { public void onCreate(Bundle savedInstanceState) { TextView tv = new TextView(this); String string = ""; super.onCreate(savedInstanceState); //得到ContentResolver对象 ContentResolver cr = getContentResolver(); //取得电话本中开始一项的光标 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //向下移动一下光标 while(cursor.moveToNext()) { //取得联系人名字 int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME); String contact = cursor.getString(nameFieldColumnIndex); //取得电话号码 int numberFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER); String number = cursor.getString(numberFieldColumnIndex); string += (contact+":"+number+"n"); } cursor.close(); //设置TextView显示的内容 tv.setText(string); //显示到屏幕 setContentView(tv); } }
本人才开始自学Android,这是《Android应用开发揭秘》中的示例源代码,上面贴的是主要代码,完整项目文件可到这个链接下载http://d.download.csdn.net/down/2263464/leejiang1982 。我不知道到底哪里出错了,才开始学,不是很懂。希望有高手能下载代码后运行一下,看一下到底哪里出错了。
------解决方案--------------------
你的androidManefest.xml写错了,导致无法在launcher界面显示icon
错误的:
android.intent.action.Main
正确的:
android.intent.action.MAIN
其他的,代码本身没有问题。
------解决方案--------------------
int numberFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
这句出错了,数据库中,contacts这张表中,不存在numbers这一列.
书上的例子大多跟不上时代了,建议你自己去
android.git.kernel.org/ 去下载source code去看吧
如果你是初学者,就不要看书了,把sdk目录下的/doc/index.html打开
按照:dev guide->referrence->resource这个顺序看一遍,比看10本书都管用
------解决方案--------------------
检查数据库,应该是没有这一列了。
------解决方案--------------------
PhoneLookup.NUMBER ,这个是字符串常量,它的值是"number" ,而getColumnIndex(String columnName)
Returns the zero-based index for the given column name, or -1 if the column doesn't exist.
这个方法是返回一个从0开始计数的列号,如果没有这个列,则反回-1
你的代码里
//取得电话号码
int numberFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
String number = cursor.getString(numberFieldColumnIndex);
第一句是取得列号,这句能正确执行,numberFieldColumnIndex的值此时为-1,因为没有"number"这个列
第二句,要据列号取得值,-1显然不是个正确的列号,报错.
我也是刚学的
------解决方案--------------------
在while (cursor.moveToNext())之前最好先cursor.moveToFirst()一下。
典型用法是这样:
if (cursor.moveToFirst()) {
do {
....
while (cursor.moveToNext());
------解决方案--------------------
if (cursor!=null&&cousor.getCount()>0) {
do {
....
while (cursor.moveToNext());
------解决方案--------------------
拿着源码熟悉环境的方法的确是最可行的办法之一。但是越是在这种情况下出错了。就越是要自己想办法找原因。初学者最好的经验来源与此