отображение номера контакта и телефона в флажке - PullRequest
0 голосов
/ 24 февраля 2012

Я хочу отобразить имя контакта и его номер телефона в флажке следующим образом: "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
    }
} 

1 Ответ

1 голос
/ 24 февраля 2012

Похоже, вы пытаетесь запросить таблицу контактов и вернуть из нее номер телефона.

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

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

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

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

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

...