2013-06-22 14 views
5

Nowe wątki. Nowość w SQL. Nowość w uzyskiwaniu informacji kontaktowych. Więc oczywiście jestem zgubiony. Jeśli czytam poprawnie ten logcat, mówi mi, że: kolumna data1 nie istnieje lub szukam niewłaściwych informacji. Niestety, jest to ścieżka uczenia się "ucz się na moich błędach" i nie mogę wymyślić tego. Wszelaka pomoc jest bardzo doceniana.Logcat mówi "nieprawidłowe dane kolumny1"

Celem jest uzyskanie nazwy, numeru telefonu i adresu e-mail kontaktu (pasujące informacje według identyfikatora kontaktu).

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 (To ciągnięcie informacje dla 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); 
    } 
} 
+0

Możesz chcieć wyjaśnić, co ten kod próbuje osiągnąć. Ponadto, gdy minie ten problem, ulegnie awarii na 'tvContactName.setText (contactName);', jak robisz tę pracę w wątku tła. Rozważ użycie 'CursorLoader' lub być może' AsyncTask', ponieważ oba oferują lepsze podejścia do aktualizacji wątków i interfejsów użytkownika. – CommonsWare

+0

dzięki za głowy tam. Edycja OP teraz – Psest328

Odpowiedz

17

Aby wyszukać numery telefonów, zapytanie Phone.CONTENT_URI i obejmują Phone.NUMBER w projekcji.

Aby pobrać adresy e-mail, należy wysłać zapytanie Email.CONTENT_URI i poprosić o Email.DATA w swojej projekcji.

Każda z tych będzie również pozwalają na to Contacts.DISPLAY_NAME w projekcji, a także, jako pewne wspólne kolumny tak są automatycznie dołączyła.

Chociaż nie pobraniu tych danych poprzez ID przed uważam, że swoje "gdzie klauzula" będzie odpowiednio Phone.CONTACT_ID + " = " + contactId i Email.CONTACT_ID + " = " + contactId. Aby uzyskać więcej informacji, patrz How to get contacts' phone number in Android.

+0

zmieniła zaznaczenie, aby pasowała do tego, co powiedziałeś, ciągle otrzymując ten sam błąd – Psest328

+0

@WizardKnight: Nie wiem, co ci powiedzieć, przepraszam. – CommonsWare

+0

bez obaw. Naprawdę bardzo pomogłeś. Podejrzewam, że jakiś bliski egzamin znajdzie gdzieś literówkę. Jeszcze raz dziękuję – Psest328

0

Zastąpienie ContactsContract.CommonDataKinds.Phone.NUMBER z ContactsContract.PhoneLookup.NORMALIZED_NUMBER może pomóc. Logcat mówi, że nazwa kolumny "data1" jest nieprawidłowa.

Powiązane problemy