Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Logcat says "invalid column data1"

New to threading. New to SQL. New to getting Contact Info. So of course I'm lost. If I'm reading this logcat correctly, it's telling me that either: column data1 doesn't exist, or that I'm looking for the wrong info. Unfortunately, this has been a "learn from my mistakes" path of learning and I can't figure this one out. Any help is very much appreciated.

The goal here is to get the Name, Phone Number, and Email of the contact (matching info by contact ID).

Log:

06-22 21:15:44.700: E/AndroidRuntime(1662): FATAL EXCEPTION: Thread-120
06-22 21:15:44.700: E/AndroidRuntime(1662): java.lang.IllegalArgumentException: Invalid column data1
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentResolver.query(ContentResolver.java:372)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at android.content.ContentResolver.query(ContentResolver.java:315)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at sat.tuts4mobile.customlistview.ContactDetails$1.run(ContactDetails.java:53)
06-22 21:15:44.700: E/AndroidRuntime(1662):     at java.lang.Thread.run(Thread.java:856)

Code (It's pulling info for contact ID 0):

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;

/**
 * Created by Pete on 6/19/13.
 */
public class ContactDetails extends Activity {

    TextView tvContactName, tvPhoneNum, tvPhoneType, tvPhoneFull,
            tvEmailAdd, tvEmailType, tvEmailFull,
            tvAddress, tvAddType, tvAddFull;

    String contactId, contactName, phoneType, phoneFull, phoneNum1,
            emailAdd, emailType, emailFull,
            address, addType, addFull;

    //Contact List query arguments
    Uri uri;
    String[] projection, selectionArgs;
    String selection, sortOrder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contactinfo);
        initialize();
        contactId = getIntent().getStringExtra("contactId");
        contactName = getIntent().getStringExtra("contactName");
        new Thread(new Runnable() {
            @Override
            public void run() {
                uri = ContactsContract.Contacts.CONTENT_URI;
                projection = new String[] {
                        ContactsContract.Data.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER
                };
                selection = ContactsContract.Data.CONTACT_ID + 
                        " = " + contactId + " AND " +
                        ContactsContract.Data.MIMETYPE + " = '" +
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'";

                selectionArgs = null;
                sortOrder = null;
                // Create cursor searching for data associated with contactId
                if (contactId != null) {
                    // Return all the PHONE data for the contact
                    Cursor cursor = getContentResolver().query(
                            uri, projection, selection, selectionArgs, sortOrder);

                    //Get the indexes of the required columns
                    while (cursor.moveToNext()) {
                        // Extract the name
                        contactName = cursor.getString(
                                cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
                        tvContactName.setText(contactName);
                        // Extract the phone number
                        phoneFull = cursor.getString(
                                cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    }
                    tvPhoneFull.post(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            tvPhoneFull.setText(phoneFull);
                        }
                    });
                    cursor.close();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
                projection = null;
                selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID + 
                        " = " + contactId + " AND " +
                        ContactsContract.Data.MIMETYPE + " = '" +
                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE + "'";

                selectionArgs = null;
                sortOrder = null;
                Cursor emailCursor = getContentResolver().query(
                        uri, projection, selection, selectionArgs, sortOrder);
                while (emailCursor.moveToNext()) {
                    // Extract email address
                    emailFull = emailCursor.getString(
                            emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                }
                tvPhoneFull.post(new Runnable() {
                    @Override
                    public void run() {
                        tvEmailFull.setText(emailFull);
                    }
                });
                emailCursor.close();
            }
        }).start();
    }
    public void initialize() {
        tvContactName = (TextView)findViewById(R.id.tvContactName);
        tvPhoneNum = (TextView)findViewById(R.id.tvPhoneNum);
        tvPhoneType = (TextView)findViewById(R.id.tvPhoneType);
        tvPhoneFull = (TextView)findViewById(R.id.tvPhoneFull);
        tvEmailAdd = (TextView)findViewById(R.id.tvEmailAdd);
        tvEmailType = (TextView)findViewById(R.id.tvEmailType);
        tvEmailFull = (TextView)findViewById(R.id.tvEmailFull);
        tvAddress = (TextView)findViewById(R.id.tvAddress);
        tvAddType = (TextView)findViewById(R.id.tvAddType);
        tvAddFull = (TextView)findViewById(R.id.tvAddFull);
    }
}
like image 286
Psest328 Avatar asked Jun 22 '13 21:06

Psest328


1 Answers

To retrieve phone numbers, query Phone.CONTENT_URI and include Phone.NUMBER in your projection.

To retrieve email addresses, query Email.CONTENT_URI and ask for Email.DATA in your projection.

Either of those will also allow you to include Contacts.DISPLAY_NAME in your projection as well, as some common columns like that are automatically joined in.

While I have not retrieved this data by ID before, I believe that your "where clause" would be Phone.CONTACT_ID + " = " + contactId and Email.CONTACT_ID + " = " + contactId respectively. See How to get contacts' phone number in Android for more.

like image 139
CommonsWare Avatar answered Nov 11 '22 00:11

CommonsWare