我想以这种方式在复选框中显示联系人姓名及其电话号码:“联系人姓名:电话号码”
但是我在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
}
}
答案 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行。