Android——Context.getString()

本文介绍了如何使用string.equals方法正确地比较字符串是否相等,并演示了如何从string.xml资源文件中加载字符串资源,这对于Android应用程序开发非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string.equals(Object obj):
比较字符串相等的方法,string是String类的实例,用string=="another string"的方法比较是无效的。

context.getString(int resId,  Object... formatArgs):
可以获取string.xml中定义的字符串,如:
<string name="mystr">我的字符串</string>,为了获取这个mystr,可以用如下方法:
this.getString(R.string.mystr);
<think>我们分析给定的代码段:该代码段使用ContentResolver查询联系人信息,并遍历游标(Cursor)获取联系人的姓名和电话号码,最后将结果添加到列表中返回。 但是,用户给出的代码片段并不完整,我们根据引用[1]和引用[2]以及常见的联系人查询模式来重构并分析。 根据引用[1],我们有一个工具类,它通过ContentResolver查询联系人,返回一个包含联系人姓名和号码的列表。 引用[2]则展示了如何根据电话号码查询联系人姓名,其中也使用了ContentResolver和Cursor。 下面我们结合这两段引用来分析一个典型的获取所有联系人姓名和号码的代码。 注意:在Android中,联系人的信息存储在多个表中。要获取联系人的电话号码,我们需要查询`CommonDataKinds.Phone`表。 典型步骤: 1. 获取ContentResolver对象。 2. 使用ContentResolver查询`Phone.CONTENT_URI`(因为一个联系人可能有多个号码,所以这个URI会返回每个号码一行,并关联到联系人)。 3. 定义要查询的列(投影),例如:联系人ID、显示名称、电话号码、电话类型等。 4. 执行查询,返回Cursor。 5. 遍历Cursor,取出每一行的姓名和号码。 6. 将每个联系人的姓名和号码封装成一个对象(如Pair或自定义类)并添加到列表中。 7. 关闭Cursor。 注意:在Android 6.0(API 23)及以上,需要动态申请READ_CONTACTS权限。 下面是一个示例代码: ```java public List<ContactInfo> getContacts(Context context) { List<ContactInfo> contactList = new ArrayList<>(); ContentResolver cr = context.getContentResolver(); // 定义要查询的列 String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; // 查询手机联系人 Cursor cursor = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, // 查询条件(无) null, // 查询条件参数 ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC" // 排序 ); if (cursor != null) { try { // 获取列索引 int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); // 遍历游标 while (cursor.moveToNext()) { // 获取联系人姓名 String name = cursor.getString(nameIndex); // 获取电话号码 String number = cursor.getString(numberIndex); // 创建联系人信息对象并添加到列表 ContactInfo contact = new ContactInfo(name, number); contactList.add(contact); } } finally { // 确保关闭游标 cursor.close(); } } return contactList; } // 简单的联系人信息类 class ContactInfo { private String name; private String phoneNumber; public ContactInfo(String name, String phoneNumber) { this.name = name; this.phoneNumber = phoneNumber; } // 省略getter和setter } ``` ### 代码分析: 1. **ContentResolver**:用于访问内容提供者(ContentProvider)的数据,这里用来访问联系人数据库。 2. **查询URI**:`Phone.CONTENT_URI`指向联系人的电话数据表。 3. **投影(Projection)**:指定要返回的列,这里只查询了显示名称和电话号码。 4. **游标(Cursor)**:查询结果以游标的形式返回,我们可以通过游标遍历每一行数据。 5. **列索引**:通过列名获取列索引,然后从游标中取出对应列的值。 6. **遍历游标**:使用`while (cursor.moveToNext())`循环遍历所有行。 7. **关闭游标**:使用完毕后必须关闭游标以释放资源,这里使用try-finally确保关闭。 ### 注意事项: - 由于一个联系人可能有多个电话号码,所以同一个联系人可能会在结果中出现多次(每个号码一行)。 - 如果只需要每个联系人的一个号码,可以根据需要过滤(比如只取第一个号码),或者按联系人ID分组。 - 权限:在AndroidManifest.xml中声明`READ_CONTACTS`权限,并在运行时检查(Android 6.0+)。 ### 性能优化建议: - 如果联系人数量很大,可以考虑使用分页查询(通过`LIMIT`和`OFFSET`)或者使用`CursorLoader`在后台加载。 - 只查询需要的列,避免查询不必要的数据(如照片等大字段)。 ### 相关问题: 1. 如何动态申请`READ_CONTACTS`权限? 2. 如何避免同一个联系人因有多个号码而重复出现? 3. 如何获取联系人的头像? 4.Android 10及以上版本,查询联系人有哪些变化? 5. 使用`CursorLoader`加载联系人数据的步骤是什么?</think>### 📱 Android联系人查询代码分析 以下代码使用 `ContentResolver` 查询设备联系人信息,并遍历游标(Cursor)将姓名和号码添加到列表中: ```java // 获取ContentResolver实例 ContentResolver cr = context.getContentResolver(); // 查询联系人URI(核心表) Cursor cursor = cr.query( ContactsContract.Contacts.CONTENT_URI, // 联系人主表URI null, // 返回所有列 null, // 无筛选条件 null, // 无筛选参数 null // 默认排序 ); // 联系人数据列表 List<ContactInfo> contactList = new ArrayList<>(); // 遍历游标处理数据 while (cursor.moveToNext()) { // 获取姓名列索引(核心步骤) int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); // 提取姓名 String name = cursor.getString(nameIndex); // 获取联系人ID(用于关联号码表) String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); // 通过ID查询号码(关键关联查询) Cursor phoneCursor = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", // 关联条件 new String[]{id}, // 绑定参数 null ); // 处理号码数据 if (phoneCursor != null && phoneCursor.moveToFirst()) { int numberIndex = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String number = phoneCursor.getString(numberIndex); contactList.add(new ContactInfo(name, number)); // 添加到列表 } if (phoneCursor != null) phoneCursor.close(); // 关闭号码游标 } cursor.close(); // 关闭主游标 return contactList; ``` ### 🔍 关键技术解析 1. **双层查询机制** - 第一层查询 `Contacts.CONTENT_URI` 获取联系人基本信息(姓名、ID等) - 第二层通过 `Phone.CONTENT_URI` + `CONTACT_ID` 关联查询号码(1:N关系) 2. **游标遍历核心逻辑** ```java while (cursor.moveToNext()) { // 逐行遍历 int index = cursor.getColumnIndex(COLUMN_NAME); // 获取列索引 String value = cursor.getString(index); // 提取数据 } ``` 3. **数据关联原理** ```mermaid graph LR A[联系人主表] -- _ID --> B[电话数据表] A -->|DISPLAY_NAME| C[姓名] B -->|NUMBER| D[电话号码] ``` 4. **性能优化点** - 使用参数化查询避免SQL注入:`"CONTACT_ID = ?"` + `new String[]{id}` - 及时关闭游标释放资源(`phoneCursor.close()`) - 按需查询列减少内存占用(示例中`null`返回所有列,实际应指定所需列) ### ⚠️ 常见问题与解决方案 | 问题类型 | 现象 | 解决方案 | |---------|------|---------| | **空指针异常** | `cursor.getColumnIndex()`返回-1 | 检查列名拼写,使用系统常量如`Contacts.DISPLAY_NAME` | | **重复联系人** | 同一联系人返回多条记录 | 使用`ContactsContract.Data.CONTENT_URI`聚合查询[^2] | | **权限缺失** | 查询返回空游标 | 动态申请`READ_CONTACTS`权限 | | **性能瓶颈** | 大数据集加载缓慢 | 改用`CursorLoader`异步加载 | ### 🌟 优化建议 1. **投影优化(减少数据量)** ```java String[] projection = { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; // 只查询必要列 ``` 2. **使用现代API** ```kotlin // Android Jetpack Contacts API val contacts = Contacts(context).query().find() ``` 3. **异步处理** ```java // 使用LoaderManager管理CursorLoader getLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() { @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 更新UI } }); ``` ### 📚 技术原理 通过 `ContentResolver` 访问系统 `ContactsProvider`,其数据模型基于三张核心表: 1. `Contacts` 表:存储联系人主体信息(`_ID`, `DISPLAY_NAME`) 2. `RawContacts` 表:存储账户关联信息 3. `Data` 表:存储具体数据项(电话、邮箱等),通过 `MIMETYPE` 区分数据类型 --- ### 📌 相关问题 1. 如何动态申请 `READ_CONTACTS` 权限?[^1] 2. 使用 `CursorLoader` 异步加载联系人数据的正确姿势是什么? 3. 如何避免同一个联系人的多个号码导致重复显示? 4.Android 10 及以上版本查询联系人有哪些新限制? 5. 如何获取联系人的头像(照片)数据?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值