2013-06-22 2 views
5

스레딩에 새로운 기능이 추가되었습니다. SQL 입문. 연락처 정보를 처음 보는 분. 그래서 나는 길을 잃었다. 이 logcat을 올바르게 읽는다면 열 데이터 1이 존재하지 않거나 잘못된 정보를 찾고있는 것입니다. 불행히도, 이것은 학습의 "실수에서 배우는"길이었고, 나는 이것을 알아 내지 못합니다. 어떤 도움이라도 대단히 감사합니다.Logcat에 "invalid column data1"이라고 표시됩니다.

목표는 연락처의 이름, 전화 번호 및 이메일 (연락처 ID로 일치하는 정보)을 얻는 것입니다.

로그 :

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) 

코드 (그것은 접촉 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

이 코드의 목적을 설명 할 수 있습니다. 또한, 일단이 문제를 극복하게되면 백그라운드 스레드에서이 작업을 수행함에 따라'tvContactName.setText (contactName);'에 충돌이 발생합니다. 'CursorLoader' 또는 아마도'AsyncTask'를 사용하는 것을 고려하십시오. 둘 다 더 나은 스레딩 및 UI 업데이트 방법을 제공합니다. – CommonsWare

+0

고개를 가져 주셔서 감사합니다. 방공호 편집 중 – Psest328

답변

17

전화 번호, 쿼리 Phone.CONTENT_URI를 검색하고 돌출부에 Phone.NUMBER을 포함합니다.

전자 메일 주소를 검색하려면 Email.CONTENT_URI을 쿼리하고 Email.DATA을 요청하십시오. 몇 가지 일반적인 열처럼 자동으로 연결된다로 사람들의

중 하나는, 당신은뿐만 아니라 당신의 투영 Contacts.DISPLAY_NAME을 포함 할 수 있습니다. 내가 전에 ID로이 데이터를 검색하지 않은 반면

, 나는 믿고 당신의 "where 절"은 각각 Phone.CONTACT_ID + " = " + contactIdEmail.CONTACT_ID + " = " + contactId입니다. 자세한 내용은 How to get contacts' phone number in Android을 참조하십시오.

+0

가 당신이 말한 것과 일치하도록 선택을 변경했습니다. 여전히 같은 오류가 발생합니다. – Psest328

+0

@WizardKnight : 당신에게 무엇을 말해야할지 모르겠군요. – CommonsWare

+0

걱정할 필요가 없습니다. 당신은 실제로 많은 도움을주었습니다. 나는 가까운 시험이 어딘가에서 오타를 찾을 것이라고 생각한다. 다시 – Psest328

0

ContactsContract.CommonDataKinds.Phone.NUMBERContactsContract.PhoneLookup.NORMALIZED_NUMBER으로 대체하는 것이 좋습니다. Logcat에 "data1"열 이름이 잘못되었습니다.

관련 문제