Android:使用ContentResolver,CONTACT_ID是列还是行?

时间:2012-03-10 16:41:08

标签: android android-contacts android-contentresolver

我的问题似乎很愚蠢,但是下面的代码令我头疼。代码下方打印contactIdtelephone 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));

请向我解释这一点。

谢谢:)

3 个答案:

答案 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