2013-06-22 10 views
5

Mới để tạo luồng. Mới đối với SQL. Mới để nhận thông tin liên hệ. Vì vậy, tất nhiên tôi bị lạc. Nếu tôi đang đọc logcat này một cách chính xác, nó nói với tôi rằng một trong hai: cột data1 không tồn tại, hoặc tôi đang tìm kiếm thông tin sai. Thật không may, đây là một con đường học tập "học từ những sai lầm của tôi" và tôi không thể hình dung ra điều này. Bất kỳ giúp đỡ được rất nhiều đánh giá cao.Logcat nói "dữ liệu cột không hợp lệ1"

Mục tiêu ở đây là nhận Tên, Số điện thoại và Email của liên hệ (thông tin đối sánh theo ID liên hệ).

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) 

Mã (Nó kéo thông tin cho tiếp xúc 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

Bạn có thể muốn giải thích mã này đang cố gắng thực hiện điều gì. Ngoài ra, một khi bạn vượt qua vấn đề này, bạn sẽ gặp sự cố trên 'tvContactName.setText (contactName);', khi bạn đang thực hiện công việc này trong một luồng nền. Hãy xem xét sử dụng một 'CursorLoader', hoặc có lẽ là một 'AsyncTask', vì cả hai cung cấp phương pháp tiếp cận luồng-và-UI-cập nhật tốt hơn. – CommonsWare

+0

cảm ơn những người đứng đầu ở đó. Chỉnh sửa OP ngay bây giờ – Psest328

Trả lời

17

Để lấy số điện thoại, truy vấn Phone.CONTENT_URI và bao gồm Phone.NUMBER trong chiếu của bạn.

Để truy xuất địa chỉ email, truy vấn Email.CONTENT_URI và yêu cầu Email.DATA trong dự đoán của bạn.

Một trong những người cũng sẽ cho phép bạn bao gồm Contacts.DISPLAY_NAME trong chiếu của bạn là tốt, như một số cột chung như thế sẽ được tự động gia nhập.

Trong khi tôi đã không lấy dữ liệu này bằng ID trước, tôi tin rằng bạn "where where" sẽ là Phone.CONTACT_ID + " = " + contactIdEmail.CONTACT_ID + " = " + contactId tương ứng. Xem How to get contacts' phone number in Android để biết thêm.

+0

đã thay đổi lựa chọn cho phù hợp với những gì bạn nói, vẫn gặp lỗi tương tự – Psest328

+0

@WizardKnight: Không biết phải nói gì với bạn, xin lỗi. – CommonsWare

+0

không phải lo lắng. Bạn thực sự đã giúp rất nhiều. Tôi nghi ngờ một số kiểm tra chặt chẽ sẽ tìm thấy một lỗi đánh máy một nơi nào đó. Cảm ơn bạn lần nữa – Psest328

0

thay thế ContactsContract.CommonDataKinds.Phone.NUMBER bằng ContactsContract.PhoneLookup.NORMALIZED_NUMBER có thể hữu ích. Logcat nói tên cột "data1" không hợp lệ.