【问题标题】:Wrongly initialized Cursor?错误初始化光标?
【发布时间】:2014-05-11 13:08:47
【问题描述】:

我必须编写一个简单的程序,让您从联系人列表中选择一个联系人,并显示该联系人的姓名、号码和图片。我得到的唯一东西是光标错误。我将给出来自 LogCat 的代码和 lof。我试图把 0 而不是 cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) 和 1 而不是 cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER),但我得到 NullPointerException。有任何想法吗?谢谢。

程序:

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.provider.ContactsContract;

public class MainActivity extends Activity {

private static final int PICK_Contact_Request = 0;
TextView textView1, textView2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    textView1 = (TextView) findViewById(R.id.contact_name);
    textView2 = (TextView) findViewById(R.id.contact_phone);
    setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public void onUpdateContact(View v)
{
    startActivityForResult(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), PICK_Contact_Request);
}

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode == PICK_Contact_Request)
    {
        if(resultCode == RESULT_OK)
        {
            Cursor cursor = null;
            try {
                ContentResolver cr = getContentResolver();
                Uri uri = data.getData();
                cursor = cr.query(uri, null, null, null, null);
                cursor.moveToFirst();
                int idx = cursor.getColumnIndex(BaseColumns._ID);
                int nameIdx = cursor.getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME);
                int photoIdIdx = cursor.getColumnIndex(CommonDataKinds.Phone.PHOTO_ID);
                String name = cursor.getString(nameIdx);
                String id = cursor.getString(idx);

                int phoneX;
                String phoneNumber = null;

                if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.HAS_PHONE_NUMBER))) > 0) 
                {
                    Cursor pCur = cr.query(CommonDataKinds.Phone.CONTENT_URI, null, BaseColumns._ID +" = ?", new String[]{id}, null);
                    pCur.moveToFirst();
                    phoneX = pCur.getColumnIndex(CommonDataKinds.Phone.NUMBER);
                    phoneNumber = pCur.getString(phoneX);
                    pCur.close();
                }
                cursor.close();

                textView1.setText(name);
                textView2.setText(phoneNumber);
                img.setImageResource(photoIdIdx);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
    }
}
}

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

 <TextView android:id="@+id/contact_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="20dp" 
    android:layout_marginTop="20dp"
     android:textSize="20sp"/>

<TextView android:id="@+id/contact_phone" 
    android:layout_width="wrap_content"
     android:layout_height="wrap_content" 
     android:layout_marginTop="5dp" 
     android:textSize="12sp" 
     android:layout_below="@id/contact_name" 
     android:layout_alignLeft="@id/contact_name"/>

<ImageView android:id="@+id/contact_portrait"
    android:contentDescription="@string/zdjecie"
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:background="#aaa" 
    android:adjustViewBounds="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignTop="@id/contact_name" 
    android:layout_marginRight="20dp"/>

<Button android:id="@+id/update_contact_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/updateContact" 
    android:layout_below="@id/contact_portrait" 
    android:onClick="onUpdateContact" 
    android:layout_centerInParent="true" 
    android:layout_marginTop="10dp"/>

LogCat:

Null Pointer Exception @ line 75: text1.setText(name); and 76 text2.setText(phoneNumber);

【问题讨论】:

  • 您的查询没有成功。 stacktrace 中的col -1 表明了这一点。
  • 问题是我尝试了 3 个稍微不同的代码,但我一直得到相同的错误。该程序运行良好,直到我从列表中选择一个联系人。我现在已经更改了程序,使它不仅可以处理异常,还可以处理异常 - 仍然无法使其正常工作。

标签: android android-contacts


【解决方案1】:

错误可能是尝试使用ContactsContract.CommonDataKinds.Phone.NUMBER 列,因为该列不属于该表,getColumnIndex() 将为其返回-1。该信息需要单独查询(先检查HAS_PHONE_NUMBER列的值)。

请参阅本教程中的“电话号码”部分:http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

更新 您的新代码至少有几个问题:

  • 在尝试读取两个游标的值之前缺少 moveToFirst()。
  • 在读取 HAS_PHONE_NUMBER 之前正在关闭光标。
  • id 列名常量应该是 BaseColumns._ID,而不是 Phone.CONTACT_ID。

【讨论】:

  • 我已经设法根据给定的教程修改了代码。谢谢,但还是有问题。
  • @user3582469 检测到新问题的更新答案。
  • 好像我没有从我的查询中得到任何数据,但我检查了它并且有数据。不知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多