2013-11-27 57 views
2

我想查詢聯繫人提供程序並獲取聯繫人信息,到目前爲止,我成功地列出了此信息,但是我更感興趣的是檢索那些具有特定生日的聯繫人的信息。到目前爲止我的代碼如下所示:只獲取聯繫人數據庫中存在其生日的聯繫人的詳細信息

public class LoaderClass extends Activity implements LoaderCallbacks<Cursor>{ 

    // private ProgressDialog pDialog; 
    // Async as; 
    TextView t1, t2; 
    Locale current; 
    Uri uri; 
    String[] projection; 
    String where; 

    public static final int progress_bar_type = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.loader_class); 

     t1 = (TextView) findViewById(R.id.textView1); 
     t2 = (TextView) findViewById(R.id.textView2); 
     t1.setText(""); 
     current = getResources().getConfiguration().locale; 
     // new Async().execute(); 

     uri = ContactsContract.Data.CONTENT_URI; 

     projection = new String[] { 
       // take from the contacts 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
       ContactsContract.CommonDataKinds.Event.START_DATE, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, 
       ContactsContract.CommonDataKinds.Photo.PHOTO 


     }; 

     where = ContactsContract.Data.MIMETYPE + "= ? AND " 
       + ContactsContract.CommonDataKinds.Event.TYPE + "=" 
       + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 


     String[] selectionArgs = new String[] { ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE }; 

     getLoaderManager().initLoader(0, null, this); 


    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
     CursorLoader loader = new CursorLoader(
       this, 
       uri, 
       projection, 
       null, 
       null, 
       null); 
     return loader; 
    } 

    @Override 
    public void onLoadFinished(
      Loader<Cursor> loader, 
      Cursor cursor) { 


     while (cursor.moveToNext()) { 

      String displayBirthday = cursor 
        .getString(cursor 
          .getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE)); 

      String name = cursor.getString(cursor 
        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 


      String ename = cursor.getString(cursor 
        .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 


      t1.append("\n"+displayBirthday+"\n"+name+"\n"+ename); 
     } 


    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

我想設計一個where子句,但我不能理解如何,任何幫助將不勝感激。

回答

-1

不要恐慌傢伙剛剛從所有聯繫人樂施會做一個清單,我認爲ü採取所有聯繫人信息只保存在一個包裝類則

ArrayList<String> matchname = new ArrayList<String>(); 
       for(int k =0;k<yourcontactwrapperlist.size();k++) 
       { 

         String keyname = yourcontactwrapperlist.get(i).yourgettermethodnameforbirthday(); 

         if((keyname.trim().size()<0)) 
         { 
          matchname.add(keyname); 

         } 
        } 
} 

,然後在臨時表u得到其中U希望所有數據顯示我認爲這將幫助ü

+0

不,我不希望在列表中保存,然後擡起頭來,它會加倍努力,它會讓我的處理速度變慢,而帶有where子句的查詢會爲我做到。 – Skynet

0
// method to get name, contact id, and birthday 
private Cursor getContactsBirthdays() { 
Uri uri = ContactsContract.Data.CONTENT_URI; 

String[] projection = new String[] { 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.START_DATE 
}; 

String where = 
     ContactsContract.Data.MIMETYPE + "= ? AND " + 
     ContactsContract.CommonDataKinds.Event.TYPE + "=" + 
     ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
String[] selectionArgs = new String[] { 
    ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE 
}; 
String sortOrder = null; 
return managedQuery(uri, projection, where, selectionArgs, sortOrder); 
} 

// iterate through all Contact's Birthdays and print in log 
Cursor cursor = getContactsBirthdays(); 
    int bDayColumn =  cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); 
    while (cursor.moveToNext()) { 
String bDay = cursor.getString(bDayColumn); 
Log.d(TAG, "Birthday: " + bDay); 
} 
+0

夥伴我從同一個教程做了它,但是如果我使用where子句,我會失去其他領域的信息。我需要一個更強大的where子句或指針如何使一個.. – Skynet

0

製作where子句:

String where = 
    ContactsContract.Data.MIMETYPE + "= ? AND " + 
    ContactsContract.CommonDataKinds.Event.TYPE + "=" + 
    ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 

而且更換你的下面一行:本

Cursor cursor = managedQuery(uri, projection, where, null, 
      sortOrder); 
+0

你能解釋where子句做什麼? – Skynet

+0

它會顯示有出生日期的聯繫人 –

+0

我使用了本教程中指定的上述查詢,但它確實會返回聯繫人的生日,但無法加載我感興趣的其他信息。無論如何,我會再試一次。 – Skynet

1

@SuppressWarnings("deprecation") 
    Cursor cursor = managedQuery(uri, projection, null, null, 
      sortOrder); 

請使用以下查詢這些:

String[] projectionFields = new String[]{ 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
}; 
ArrayList<Contact> listContacts = new ArrayList<>(); 
CursorLoader cursorLoader = new CursorLoader(context, 
     ContactsContract.Contacts.CONTENT_URI, 
     projectionFields, // the columns to retrieve 
     null, // the selection criteria (none) 
     null, // the selection args (none) 
     null // the sort order (default) 
); 

Cursor c = cursorLoader.loadInBackground(); 

final Map<String, SynchData.clientsData> contactsMap = new HashMap<>(c.getCount()); 

if(c.moveToFirst()){ 

    int idIndex = c.getColumnIndex(ContactsContract.Contacts._ID); 
    int nameIndex = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 

    do { 
     String contactId = c.getString(idIndex); 

     String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + 
       ContactsContract.CommonDataKinds.Event.TYPE + " = " + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
     String[] selectionArgs = new String[]{id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE}; 

     Cursor birthDateCur = cr.query(ContactsContract.Data.CONTENT_URI, null, where, selectionArgs, null); 

     while (birthDateCur.moveToNext()) { 
      birthDate = birthDateCur.getString(birthDateCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE)); 
      if (birthDate != null && !birthDate.equalsIgnoreCase("")) { 
       if (!birthDate.equalsIgnoreCase("")) { 
        print(" birthDate " + birthDate); 
        break; 
       } 
      } 
     } 
     birthDateCur.close(); 


    } while (c.moveToNext()); 
} 
c.close(); 
相關問題