2013-06-22 4 views
1

Я делаю это самостоятельно с помощью межстраниц и много ссылок на несколько книг. В приведенном ниже коде указывается имя и номер телефона конкретного контакта, и он работает (сладко). Мой вопрос касается выбора и выбораArgs. Как добавить запрос в электронную почту?Создание контактного приложения. Получение зависания

Я не понимаю всех равных знаков и котировок И, поэтому, если вы можете указать мне, где я могу больше узнать о языке, используемом в «выборе», а не просто дать мне ответ в коде, это Я также очень помогаю мне.

Заранее спасибо

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"); 

     queryArgs(); 

     // 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.setText(phoneFull); 
      } 
      cursor.close(); 
     }   
    } 

    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); 
    } 

    public void queryArgs() { 
     // Cursor query arguments 
     uri = ContactsContract.Data.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; 
    } 

    public void setTextValues() { 
     tvContactName.setText(contactName); 
     tvPhoneNum.setText(phoneNum1); 
     tvPhoneType.setText(phoneType); 
     tvPhoneFull.setText(phoneFull); 
     tvEmailAdd.setText(emailAdd); 
     tvEmailType.setText(emailType); 
     tvEmailFull.setText(emailFull); 
     tvAddress.setText(address); 
     tvAddType.setText(addType); 
     tvAddFull.setText(addFull); 
    } 
} 

редактировать: Я опробовал идею Sandy09 (в минус то, что я считаю, это опечатка после cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER));

Теперь я получаю эту ошибку, и когда я возвращаю свой код, я получаю его (минус ссылка на поток). Вся помощь ценится:

06-22 04:45:56.316: E/AndroidRuntime(8818): FATAL EXCEPTION: Thread-273 
06-22 04:45:56.316: E/AndroidRuntime(8818): android.database.sqlite.SQLiteException: unrecognized token: "'vnd.android.cursor.item/phone_v2))" (code 1): , while compiling: SELECT DISTINCT display_name, data1 FROM view_data data WHERE (1) AND ((contact_id = 1 AND mimetype = 'vnd.android.cursor.item/phone_v2)) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at android.content.ContentProviderProxy.query(ContentProviderNative.java:366) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at android.content.ContentResolver.query(ContentResolver.java:372) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at android.content.ContentResolver.query(ContentResolver.java:315) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at sat.tuts4mobile.customlistview.ContactDetails$1.run(ContactDetails.java:42) 
06-22 04:45:56.316: E/AndroidRuntime(8818):  at java.lang.Thread.run(Thread.java:856) 
+0

Язык, используемый в предложении where, сильно зависит от SQL. Я не думаю, что ContentProvider поддерживает гораздо больше, чем 'AND' и' OR'. – 323go

+0

Я надеялся, что это так, но когда я попытался: ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "AND" + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE + "'"; Я закончил тем, что ничего не получил, поэтому я знаю, что есть еще что-то. – Psest328

+0

О, я вижу твою проблему сейчас. Неверный запрос. Я отправлю исправленное в ответ. – 323go

ответ

1

Спасибо, что разъяснил, с чем вы столкнулись. Так да,

selection = ContactsContract.Data.CONTACT_ID + " = " + contactId + " AND " + 
       ContactsContract.Data.MIMETYPE + " = " + 
       ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'"; 

выбирает номера телефонов. Ну, почти - ему не хватает ' до CONTENT_ITEM_TYPE.

Для того, чтобы расширить это, вам нужно добавить дополнительную проверку, например, так:

selection = ContactsContract.Data.CONTACT_ID + " = " + contactId + " AND (" + 
       ContactsContract.Data.MIMETYPE + " = '" + 
       ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "' OR " + 
       ContactsContract.Data.MIMETYPE + " = '" + 
       ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE + "')"; 

Это переведет в нечто вроде -

CONTACT_ID = 123 AND (MIMETYPE = 'Phone' OR MIMETYPE = 'Email') 

Хотя это собственно Android программирования использовать классы контрактов, как и вы, делают это для ужасной удобочитаемости и устранения неполадок.

+0

да, извините. в то время как я изучаю, мне легче держать все в разных отсеках, пока я не привык к этому. Я направляюсь в постель, поэтому я попробую это утром. Правильно ли я думаю, что мне также нужно добавьте к проекции: ContactsContract.CommonDataKinds.Email.ADDRESS? – Psest328

+1

Нет причин сожалеть - это просто нормально игнорировать отсутствующую одиночную кавычку среди всего этого беспорядка. Здесь вы не делаете ничего плохого. И да , вам нужно расширить свою проекцию, чтобы включить столбцы, которые вы хотели бы видеть. Спокойной ночи! – 323go

1

Android предпочитают запускать данные базовые операции на новом потоке (задача), чтобы избежать диалога ANR, написать запрос на новой нити,

Для email вы можете передать это , для всех providers проходить через android doc.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    initialize(); 
      contactId = getIntent().getStringExtra("contactId"); 
      contactName = getIntent().getStringExtra("contactName"); 
      new Thread(new Runnable() { 
       @Override 
      public void run() { 
      queryArgs(); 
      if (contactId != null) { 
      Cursor cursor = getContentResolver().query(uri, projection, 
          selection, selectionArgs, sortOrder); 
      while (cursor.moveToNext()) { 
        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() { 
         tvPhoneFull.setText(phoneFull); 
         } 
        }); 

        cursor.close(); 
       } 
      } 
     }).start(); 

    } 
+0

Спасибо за это. Сделаю – Psest328