Cursor cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
时间: 2024-03-31 11:34:39 浏览: 109
这段代码使用了Android提供的ContentProvider访问联系人数据。具体来说,它通过调用getContentResolver()方法获取ContentResolver对象,然后调用query()方法查询系统联系人数据。它的参数如下:
- Uri uri:ContentProvider的URI,表示要查询的数据源。在这里,它是ContactsContract.Contacts.CONTENT_URI,表示查询系统联系人数据。
- String[] projection:查询需要返回哪些列,如果为null,表示返回所有列。
- String selection:查询数据的筛选条件,相当于SQL语句中的WHERE部分。
- String[] selectionArgs:如果在selection中有占位符(如“name = ?”),那么可以使用selectionArgs参数传递具体的值。
- String sortOrder:查询结果的排序方式。
在这个例子中,它使用了null作为projection、selection、selectionArgs和sortOrder的值,表示查询所有联系人数据并按默认方式排序。查询结果是一个Cursor对象,可以通过Cursor的方法遍历查询结果集合。
相关问题
public class RetrieveDataActivity extends Activity { private String[] columns={ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv=(TextView) findViewById(R.id.result); tv.setText(getQueryData()); } private String getQueryData(){ StringBuilder sb=new StringBuilder(); ContentResolver resolver=getContentResolver(); Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); while (cursor.moveToNext()){ int idIndex=cursor.getColumnIndex(columns[0]); int displayNameIndex= cursor.getColumnIndex(columns[1]); int id=cursor.getInt(idIndex); String displayName=cursor.getString(displayNameIndex); Cursor phone= resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,columns[3]+"="+id,null,null); while(phone.moveToNext()){ int phoneNumberIndex=phone.getColumnIndex(columns[2]); String phoneNumber=phone.getString(phoneNumberIndex); sb.append(displayName+":"+phoneNumber+"\n"); cursor.close(); } }
根据你提供的代码,我发现在第二个while循环中,没有关闭`phone`游标。这可能是导致无法查询出通讯录内容的原因之一。
另外,`cursor.close()`应该在第一个while循环的末尾处调用,而不是在第二个while循环的末尾处调用。因为第二个while循环是在第一个while循环的内部执行的,如果在第二个while循环中关闭了游标,那么第一个while循环将无法正常执行。
此外,我还注意到在查询电话号码时,`columns[3]`应该是`ContactsContract.CommonDataKinds.Phone.CONTACT_ID`,而不是`ContactsContract.CommonDataKinds.Phone.NUMBER`,因为`columns[3]`对应的是通讯录ID,而不是电话号码。
修改后的代码如下:
```
public class RetrieveDataActivity extends Activity {
private String[] columns = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.result);
tv.setText(getQueryData());
}
private String getQueryData() {
StringBuilder sb = new StringBuilder();
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
int idIndex = cursor.getColumnIndex(columns[0]);
int displayNameIndex = cursor.getColumnIndex(columns[1]);
int id = cursor.getInt(idIndex);
String displayName = cursor.getString(displayNameIndex);
Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, columns[3] + "=" + id, null, null);
while (phone.moveToNext()) {
int phoneNumberIndex = phone.getColumnIndex(columns[2]);
String phoneNumber = phone.getString(phoneNumberIndex);
sb.append(displayName + ":" + phoneNumber + "\n");
}
phone.close();
}
cursor.close();
return sb.toString();
}
}
```
希望这可以帮到你。
private Cursor getContentName(String name_search) { selections = ContactsContract.Contacts.DISPLAY_NAME + "=?"; selection_args = new String[]{name_search}; Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, query_all, selections, selection_args, null); return cursor; }
这是一段 Android 平台上的代码,它的作用是查询通讯录中指定姓名的联系人信息,并返回一个 Cursor 对象。首先定义了一个 selections 字符串,用来指定查询条件,它的值为 ContactsContract.Contacts.DISPLAY_NAME + "=?",表示查询通讯录中 DISPLAY_NAME 列(即联系人姓名)等于指定的 name_search 的记录。然后定义了一个 selection_args 数组,它的值为 name_search,即要查询的联系人姓名。接着调用 getContentResolver().query() 方法查询通讯录,查询的 Uri 是 ContactsContract.CommonDataKinds.Phone.CONTENT_URI,表示查询通讯录中的电话号码信息。query_all 是一个字符串数组,表示要查询的列,它的值为 null,表示查询全部列。最后将 selections 和 selection_args 作为参数传入,表示查询条件,排序方式为 null,返回一个 Cursor 对象。
阅读全文