在复选框中显示联系人和电话号码

时间:2012-02-23 21:29:35

标签: android listview checkbox contactscontract

我想以这种方式在复选框中显示联系人姓名及其电话号码:“联系人姓名:电话号码” 但是我在logcat "java.lang.IllegalArgumentException: Invalid column data1"

中发现了这个错误

以下是我使用的代码----->

package wael.ilahi.pfe;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.zip.Inflater;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
 ...


public class SelectFriends extends Activity implements  OnClickListener {
    public static final String TAG = "ContactManager";
    private Button bSave;
    private ListView lv;
    private boolean mShowInvisible;
    CheckBox ch;
    String s;
    int k=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        Log.v(TAG, "Activity State: onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        bSave = (Button) findViewById(R.id.addContactButton);
        lv = (ListView) findViewById(R.id.contactList); 
        populateContactList();

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,final                 
                int position, long id) {
            ch = (CheckBox) view.findViewById(R.id.checkBox);
            ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(),
                         "Click ListItem Number " + position, Toast.LENGTH_LONG).show();
                    }
                });     
            }
        });

        bSave.setOnClickListener(this);
    }

    private void populateContactList() {
        // Build adapter with contact entries
        Cursor cursor = getContacts();
        String[] fields = new String[] {
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME +":"+ 
            ContactsContract.CommonDataKinds.Phone.NUMBER};

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,  
        R.layout.contact_entry, cursor,fields, new int[] {R.id.checkBox});
        lv.setAdapter(adapter);
    }

    private Cursor getContacts(){
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] {

             //ContactsContract.Contacts.DISPLAY_NAME, 
             ContactsContract.CommonDataKinds.Phone.NUMBER };
        String selection = null;
        String[] selectionArgs = null;
        String sortOrder =null;

        return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    }

    @Override
    public void onClick(View arg0) {
         // TODO Auto-generated method stub
    }
} 

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试查询“联系人”表并从中返回电话号码。

不幸的是,这不是联系人提供商的工作方式。综上所述: Contacts Provider有三个表:Contacts,RawContacts和Data。每个Contact行 指向一个或多个RawContacts行。每个RawContact行指向一个或多个数据行。

人们作为原始联系人存储在Contacts Provider中。提供者本身创建 联系行。系统会自动选择一个原始联系人姓名作为联系人行的DISPLAY_NAME_PRIMARY。

数据表包含原始联系人的详细信息。行是通用的。它们中的每一个都具有相同的列名,您可以在ContactsContract.Data中看到它们。要选择特定类型的详细信息(例如电话号码),您必须搜索MIME类型为ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE的数据行。然后,您可以将该行中的电话号码称为 ContactsContract.CommonDataKinds.Phone.PHONE_NUMBER;这个常数的值是 “数据1”。也就是说,CommonDataKinds类中的常量是列名的别名 DATAC-DATA15在ContactsContract.Data中定义。别名使得理解数据行的语义变得更容易。

有一种简单的方法可以实现您的目标:使用ContactsContract.Contacts.Entity构造。这将返回一个Cursor,其中包含Contact的所有Data和RawContacts行。如果将选择参数设置为ContactsContract.Data.MIME_TYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,则只能检索电话号码。

注意:原始联系人的显示名称存储在数据表中,如下所示 ContactsContract.CommonDataKinds.StructuredName行。