2012-02-23 3 views
0

Я хочу, чтобы отобразить имя контакта и его номер телефона в флажком в этой манере: «ContactName: Номер телефона» Но я нахожу эту ошибку в 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

Добавьте полный StackTrace к вашему вопросу. –

ответ

1

это выглядит как вы пытаетесь запросить таблицу Контакты и возвращает номер телефона из него.

К сожалению, это не так, как работает поставщик контактов. Вкратце: Поставщик контактов имеет три таблицы: Контакты, RawContacts и Data. Каждая строка контактов указывает на одну или несколько строк RawContacts. Каждая строка RawContact указывает на одну или несколько строк данных.

Люди хранятся в поставщике контактов в качестве сырых контактов. Сам поставщик создает Строки контактов. Одно имя необработанного контакта выбирается автоматически как DISPLAY_NAME_PRIMARY строки Contact.

В таблице данных содержатся детали для сырого контакта. Строки являются общими. Каждый из них имеет одинаковые имена столбцов, которые вы можете увидеть в ContactsContract.Data. Чтобы выбрать конкретный тип деталей, например номер телефона, вам нужно найти строку данных, которая имеет тип MIME ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE. Затем вы можете обратиться к номеру телефона в этой строке как ContactsContract.CommonDataKinds.Phone.PHONE_NUMBER; значение этой константы равно «data1». То есть константы в классах CommonDataKinds являются псевдонимами для имен столбцов DATA1-DATA15, определенных в ContactsContract.Data. Алиасы облегчают понимание семантики строки данных.

Существует простой способ достижения вашей цели: использовать конструкцию ContactsContract.Contacts.Entity. Это возвращает курсор, содержащий все строки данных и RawContacts для контакта. Если вы установите аргументы выбора в ContactsContract.Data.MIME_TYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, вы получите только номера телефонов.

Примечания: Отображаемое имя сырого контакта хранится в таблице данных в виде строки ContactsContract.CommonDataKinds.StructuredName.

+0

Я просто попробовал этот код, чтобы отображать номера телефонов в флажке в спискеView –