2011-12-06 2 views
1

몇 가지 질문을 할 수있을 것 같아요. 지금까지 특정 유형의 데이터 (현재 DISPLAY_NAME, NUMBER 및 ADDRESS)에 대한 Android 주소록 데이터베이스를 쿼리하는 애플리케이션이 있습니다. 그런 다음 커서 쿼리 결과를 ListView에 채 웁니다. 내 문제는, 나는 3 개의 별도 커서를 사용하여 데이터를 가져 왔으며, 나는 ListView 행 (R.id.contact_name, R.id.contact_number, R.id.)에있는 모든 항목을 3 개의 항목에 바인딩하려고합니다. 연락처).안드로이드 멀티 테이블 커서 목록보기를 채우는

3 개의 다른 커서를 사용하여이 작업을 수행하는 방법을 잘 모르겠으며 지난 몇 일 동안 둘러 본 후에 "MergeCursor?"와 같은 몇 가지 구문을 제외하고는 실제 지침을 찾을 수 없었습니다. sp) 또는 데이터베이스 테이블을 함께 결합하려고합니다. 또한 onCreate() 내 목록을 채우고 싶지 않습니다. AsyncTask의 doInBackground()에서 일부 사용자는 많은 연락처를 가질 수 있기 때문에 UI 스레드를 차단하고 싶지는 않습니다. 이미 발생하고 있습니다. 하지만 비동기로 개체수를 구현하려고하면 Eclipse에서 SimpleCursorAdapter에 대한 많은 오류를 표시합니다. 여기에 현재 코드가 있습니다. 이 아키텍처를 개선하고 내가 겪고있는 문제를 해결하는 방법에 대한 지침은 크게 감사 할 것입니다. 감사합니다!

 public class Contacts extends ListActivity { 

    private static final String TAG = "Contacts"; 

    Cursor c, pCur, addrCur; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Uri contacts = ContactsContract.Contacts.CONTENT_URI; 
    ContentResolver cr = getContentResolver(); 

    String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME }; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
      + " COLLATE LOCALIZED ASC"; 
    Log.d(TAG, "Getting Display Names...."); 

    // Query the Contacts Content Provider for ONLY Contacts that have phone 
    // numbers 
    // listed 

    c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null, 
      sortOrder); 
    // Get their display names 
    if (c.getCount() > 0) { 
     // While there is more data 
     while (c.moveToNext() 
       && Integer 
         .parseInt(c.getString(c 
           .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      String id = c.getString(c 
        .getColumnIndex(ContactsContract.Contacts._ID)); 

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

      // Query Phone Numbers Next 

      /* 
      * if (Integer .parseInt(c.getString(c 
      * .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) 
      * > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
      * ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
      * ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" , 
      * new String[]{id}, null); while (pCur.moveToNext()) { 
      * 
      * String phone_number = pCur .getString(pCur 
      * .getColumnIndex(ContactsContract 
      * .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG, 
      * "Finished Getting Phone Numbers...."); } 
      */ 

      // Query the Addresses 
      Log.d(TAG, "Getting Addresses...."); 
      String addrWhere = ContactsContract.Data.CONTACT_ID 
        + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 

      String[] addWhereParams = new String[] { 
        id, 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }; 

      addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null, 
        null, null, null); 

      while (addrCur.moveToNext()) { 
       String poBox = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 

       String street = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 

       String city = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 

       String state = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 

       String postalCode = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 

       String country = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 

       String type = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 

      } 
      addrCur.close(); 
      Log.d(TAG, "Finished Getting Addresses...."); 

     } 
    } 
    // new loadContacts().execute(TAG); 
    final int[] TO = { R.id.contact_name }; 
    final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME }; 

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.contact_item, c, FROM, TO); 
    setListAdapter(adapter); 
    // adapter.changeCursor(pCur); 


} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    c.moveToPosition(position); 

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

    Toast.makeText(this, "You Selected " + name, Toast.LENGTH_SHORT).show(); 





    //Toast t = Toast.makeText(Contacts.this, "You Selected " + position, Toast.LENGTH_SHORT); 
    //t.show(); 
} 

}

+0

아마도 ListView에 대한 고유 한 어댑터를 정의하고 쿼리 결과를 어댑터에 병합하는 것이 좋습니다. –

답변

0

MergeCursor 다른 결과로 하나 개의 쿼리의 결과를 concatonating에 대한 더 많은 것이다. 더 많은 열이 아니라 더 많은 열로 생각하십시오.

각 쿼리 (전화 번호 하나, 다른 주소)에서 원하는 경우 여러 소스에서 가져 오는 경우 CursorJoiner을 사용하고 싶습니다. CursorJoiner를 사용하면 동일한 기본 키로 정렬 된 두 개의 커서를 가져와 각 상위 커서에서 원하는 열로 새 Cursor를 만들 수 있습니다. 간략한 사용 방법 개요는 링크 된 문서에 포함되어 있습니다.

행운을 빈다.

편집 : 별도의 스레드에서 쿼리를 실행하는 방법에 대한 답변을 얻으려면 시작하려면 Loaders에서 시작하는 것이 좋습니다.

+0

알렉스, 고맙습니다! 또한 별도의 스레드에서 목록을 채우는 것에 대한 아이디어가 있습니까? 나는 UI에 뒤처져 있기 때문에 생기고 싶지 않습니다. 다시 한 번 감사드립니다! –

+0

sure- 유용한 링크가 포함 된 답변을 업데이트했습니다. –

관련 문제