我的问题似乎很愚蠢,但是下面的代码令我头疼。代码下方打印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本身)。传递null将 返回给定URI的所有行。
所以,正如这个定义,CONTACT_ID
充当“行”。 (因为它filter which row to return
),
但是作为这一行,CONTACT_ID
充当“A COLUMN”:
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
请向我解释这一点。
谢谢:)
答案 0 :(得分:1)
这是一个列(声明为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 :(得分:1)
你应该看一下sql查询,如果我们想从表A中选择列column1,如果它的值为5则进行过滤,那么我们将把这个查询写成:
SELECT column1来自A WHERE column1 = 5
这意味着从table1中选择值,其中column1的值等于5.所以这里没有什么不寻常的。
答案 2 :(得分:0)
CONTACT_ID是一个专栏。 例如,当您使用“CONTACT_ID = 10”过滤器表达式时 您将获得CONTACT_ID单元格中值为10的所有行。 请参阅以下有关SQL中where子句的链接: http://www.w3schools.com/sql/sql_where.asp