2013-11-27 5 views
2

연락처 공급자를 쿼리하고 연락처 정보를 가져 오려고하는데, 지금까지이 정보를 나열하는 데 성공했지만, 검색하는 데 더 많은 관심이 있습니다. 생년월일이 지정된 연락처의 정보. 내가 where 절을 설계 할연락처 데이터베이스에 생일이있는 연락처 (안드로이드)

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 

    } 

} 

,하지만 난 어떤 도움은 매우 극명하게 될 것이다 어떻게 이해 할 수없는입니다 : 지금까지 다음과 같이 내 코드 보인다.

답변

-1

공황 친구 그냥 모든 연락처 ohk에서 하나 개의 목록을 해달라고 난 u는 단지 다음 하나 개의 래퍼 클래스

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