Android: использовать ContentResolver, CONTACT_ID - это столбец или строка? - PullRequest
1 голос
/ 10 марта 2012

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

Работает хорошо, но кое-что мне нужно знать более четко:

 ContentResolver solver = getContentResolver();
            String mess="";

            Cursor cursor = solver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
            while (cursor.moveToNext()){
                String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                mess = mess + "ID: "+contactId+"\n";

                Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);
                while (phones.moveToNext()) { 
                     String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));    
                     mess = mess + phoneNumber + "\n";
                  } 
            }

То, чего я не знаю, это строка кода выше:

Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);

Как и в Android Development о третьем параметре:

выделение: фильтр, декларирующий, какие строки возвращать, отформатированный как Предложение SQL WHERE (исключая само WHERE). Проходя ноль воли вернуть все строки для данного URI.

Таким образом, как это определение, CONTACT_ID действует как «ряд». (потому что это filter which row to return)

но как эта строка, CONTACT_ID действует как "КОЛОННА":

String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

Пожалуйста, объясните мне этот момент.

спасибо:)

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Это столбец (объявленный так INTEGER PRIMARY KEY AUTOINCREMENT).В:

Cursor phones = getContentResolver().query( 
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                    null, 
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, 
                    null, null);

вы запрашиваете ContentProvider, но используете столбец _ID для фильтрации результатов.Вы говорите: «Я хочу строки из ContentProvider, где в столбце _ID я нахожу только значение contactId ».В:

String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

_ID используется для получения целого числа индекса столбца (для получения значений из этого столбца), поэтому вам не нужно использовать простые числа, такие как 0, 1, 2 и, возможно, избежатьошибки.

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

1 голос
/ 10 марта 2012

Вам следует взглянуть на SQL-запросы, если мы хотим выбрать столбец column1 из таблицы A, с фильтрацией, если его значение равно 5, тогда мы бы написали этот запрос как

ВЫБРАТЬ столбец1 В ГДЕ столбец1 = 5

Это означает выбор значений из таблицы со значением column1, равным 5. Так что здесь нет ничего необычного.

0 голосов
/ 10 марта 2012

CONTACT_ID - это столбец.например, когда вы используете выражение фильтра «CONTACT_ID = 10», вы получите все строки со значением 10 в своей ячейке CONTACT_ID.см. следующую ссылку о предложении where в SQL: http://www.w3schools.com/sql/sql_where.asp

...