2013-10-24 3 views
8

У меня есть два вопроса:Получить настройку порядка сортировки выбранного пользователя в Контакты> Настройки на устройстве Android и как сократить время запроса?

1: Как мое приложение может знать, по умолчанию порядок сортировки, используемый для сортировки родной «для Android устройств Контакты»?

Внутри «Контакты» -> «Настройка» в андроиде, у нас есть «Списка по» и «Показать контакты по» опциям. Как я могу получить эти предварительные условия в своем приложении.

Например: предположим, что контакты устройства сортируются по имени «Имя», тогда приложение должно получить некоторую константу (или что-то подобное). С другой стороны, если контакты сортируются по «Фамилии», то приложение должно получать константы (или информацию) относительно того же.

Я искал SO, и я получил эту link, но проблема заключается в том, что раствор осуждается в уровне API 5.

Вот мой запрос для извлечения контактов

String userPreference = getPrefContacts();/* **getPrefContacts() will return either ContactsContract.Data.DATA2 or ContactsContract.Data.DATA3** */ 
    try { 
       ContentResolver cr = getActivity().getContentResolver(); 
       String[] projectionName = new String[] { 
         ContactsContract.Data.CONTACT_ID, 
         ContactsContract.Data.DATA2, ContactsContract.Data.DATA5, 
         ContactsContract.Data.DATA3, ContactsContract.Data.DATA1 }; 
       String sortOrder = userPrefrence 
         + " COLLATE LOCALIZED ASC"; 

       Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI, 
         projectionName, null, null, sortOrder); 
       nameCursor.moveToFirst(); 
       if (nameCursor.getCount() > 0) { 
        do { 
         String fName = nameCursor 
           .getString(nameCursor 
             .getColumnIndexOrThrow(ContactsContract.Data.DATA2)); 
         String mName = nameCursor 
           .getString(nameCursor 
             .getColumnIndexOrThrow(ContactsContract.Data.DATA5)); 
         String lName = nameCursor 
           .getString(nameCursor 
             .getColumnIndexOrThrow(ContactsContract.Data.DATA3)); 
         String name = nameCursor 
           .getString(nameCursor 
             .getColumnIndexOrThrow(ContactsContract.Data.DATA1)); 
         if (name != null) { 
          String[] projectionCommon = new String[] { 
            ContactsContract.Contacts._ID, 
            ContactsContract.Contacts.HAS_PHONE_NUMBER }; 
          String selectionCommon = ContactsContract.Contacts.DISPLAY_NAME 
            + " = ?"; 
          String[] selectionArgCommon = new String[] { name }; 

          Cursor common = cr.query(
            ContactsContract.Contacts.CONTENT_URI, 
            projectionCommon, selectionCommon, 
            selectionArgCommon, null); 
          if (common.getCount() > 0) { 
           while (common.moveToNext()) { 
            String contactID = common 
              .getString(common 
                .getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 
            int hasPhone = common 
              .getInt(common 
                .getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
            if (hasPhone > 0) { 
             String[] projectionPhone = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }; 
             String selectionPhone = ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
               + " = ?"; 
             String[] selectionArgPhone = new String[] { contactID }; 
             Cursor phoneCursor = cr 
               .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                 projectionPhone, 
                 selectionPhone, 
                 selectionArgPhone, null); 

             if (phoneCursor.getCount() > 0) { 
              while (phoneCursor.moveToNext()) { 
               String phone = phoneCursor 
                 .getString(phoneCursor 
                   .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
               if (phone != null) { 
                ContactData tmp = new ContactData(
                  name, fName, mName, 
                  lName, phone, contactID); 
                if (raw.size() == 0) { 
                 raw.add(tmp); 
                } else if (!(raw 
                  .get(raw.size() - 1)) 
                  .getContactID() 
                  .equalsIgnoreCase(
                    tmp.getContactID())) { 
                 raw.add(tmp); 
                } 
               } 
              } 
             } 
             phoneCursor.close(); 
            } 
           } 
          } 
          common.close(); 
         } 
        } while (nameCursor.moveToNext()); 
        nameCursor.close(); 
       } 
      } catch (NumberFormatException e) { 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

Мне нужен код для getPrefContacts()метод

2: Как уменьшить время запроса потребляемую относительно выше кода или любой другой способ сделать это?

Надеюсь, что кто-нибудь может мне помочь.

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

ответ

4

Я могу ответить на ваш второй вопрос.

Вы можете использовать присоединиться атрибут SQL при запросе поставщиков контента. Таким образом, удаление вложенных циклов и, следовательно, сокращение времени запроса.


Edit: Для ваших первых Ques, попробуйте следующее:

INT sort_order = Settings.system.getInt (getApplicationContext () .getContentResolver(), "android.contacts. ПОРЯДОК СОРТИРОВКИ");

На моем устройстве Samsung S2, sort_order = 1 когда контакты перечислены FirstName и sort_order = 2 когда контакты перечислены LastName.

+0

Да, вы правы в атрибуте ** join **. – Susomrof

1

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

Фильтр и сортировка данных обрабатываются адаптером. Вам необходимо реализовать логику в реализации пользовательского адаптера.

Адаптер назначается ListView с помощью метода setAdapter объекта ListView.

для например

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Cursor mCursor = getContacts(); 
    startManagingCursor(mCursor); 
    // now create a new list adapter bound to the cursor. 
    // SimpleListAdapter is designed for binding to a Cursor. 
    ListAdapter adapter = new SimpleCursorAdapter(this, // Context. 
     android.R.layout.two_line_list_item, // Specify the row template 
          // to use (here, two 
          // columns bound to the 
          // two retrieved cursor 
          // rows). 
     mCursor, // Pass in the cursor to bind to. 
     // Array of cursor columns to bind to. 
     new String[] { ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME }, 
     // Parallel array of which template objects to bind to those 
     // columns. 
     new int[] { android.R.id.text1, android.R.id.text2 }); 

    // Bind to our new adapter. 
    setListAdapter(adapter); 
    } 

    private Cursor getContacts() { 
    // Run query 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" 
     + ("1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
     + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, 
     sortOrder); 
    } 

Здесь Порядок сортировки управляется с помощью курсора, который содержит данные для списка.

+1

, но я хочу знать: в каком порядке сортировка устройства, т. Е. Какой пользователь предпочитает ** список по ** опции (список по: ** firstName ** или ** lastName **). – Susomrof