【contacts】Phonebook电话本

http://developer.android.com/intl/zh-CN/reference/packages.html

访问电话本权限

Android的应用程序AndroidManifest.xml中加入:<uses-permission android:name="android.permission.READ_CONTACTS"/> 权限

联系人存放的数据库

Android中的联系人都保存在一个SQLite数据库中,它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db


contacts2.db的简单介绍可访问:http://hi.baidu.com/_sherry_liu/item/50431e38bef2c24e033edc9b

在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。
表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时候不是每次都需要读取所有的联系人资料的,这样可以更灵活的选择我们所关心的内容,提高检索速度, 虽然分开的保存数据,可以提高检索的速度,但是也给我们带来了一些不便,就是需要把这些分开的表再重新联合起来,组成我们所需要的完整的数据。
好在这些,android已经替我们准备好了,它在数据库里面建了一些视图。并且,android也提供了很多接口,通过ContentResolver().query方法,传入不同的URI即可访问相应的数据集。
在联系人数据库里面联系人和电话号码是分别存在两个表里面的,因为存在一个联系人拥有几个号码的情况,所以android为联系人和手机号码分别单独创建了相应的视图。
联系人信息的视图里面只保存与联系人相关的资料,例如姓名,是否有手机号码等。 而手机号码资料则是每一个电话号码为一条记录,如果有一个联系人有3个号码,则里面会出现3个该联系人的记录,号码分别为他的三个号码。
如果是需要读取联系人信息,传入的URI为:ContactsContract.Contacts.CONTENT_URI
如果是需要读取手机号码信息传入的URI为:ContactsContract.CommonDataKinds.Phone.CONTENT_URI


电话本访问应用到的类

Cursor类:
android.database.Cursor:
http://developer.android.com/intl/zh-CN/reference/android/database/Cursor.html
关于Cursor的重要方法:
  • close() 关闭游标,释放资源
  • copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将其存储
  • getColumnCount() 返回所有列的总数
  • getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
  • getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
  • getColumnName(int columnIndex) 从给定的索引返回列名
  • getColumnNames() 返回一个字符串数组的列名
  • getCount() 返回Cursor 中的行数
  • moveToFirst() 移动光标到第一行
  • moveToLast() 移动光标到最后一行
  • moveToNext() 移动光标到下一行
  • moveToPosition(int position) 移动光标到一个绝对的位置
  • moveToPrevious() 移动光标到上一行

Contacts类:
android.provider.ContactsContract.Contacts:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.Contacts.html
关联存储联系人的数据表,每个记录集代表一个联系人。Contacts类定义的常量,包含了联系人表的所有列。

ContentResolver类:
android.content.ContentResolver:
http://developer.android.com/intl/zh-CN/reference/android/content/ContentResolver.html
说明:当外部应用需要数据进行添加、删除、修改和查询操作时,需要使用ContentResolver 类来完成。
关于Cursor的重要方法:
  • public Uri insert(Uri uri, ContentValues values)  该方法用于添加数据。 
  • public int delete(Uri uri, String selection, String[] selectionArgs) 该方法用于删除数据。 
  • public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 该方法用于更新数据。 
  • public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 该方法用于获取数据。
    projection:是需要读取的字段
    selection:是数据检索的条件
    selectionArgs:是数据检索条件的参数
    sortOrder:是排序的字段


Phone类:
android.provider.ContactsContract.CommonDataKinds.Phone:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html
关联电话号码数据表, 定义了查询电话号码的Url


代码逻辑

  • 首先,通过Activity的getContentResolver()得到ContentResolver的实例,检索联系人数据表。
    通过url指明检索的数据表,其他参数指明检索的条件等
    Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)

    检索条件是很重要的,我们只想取得联系人的相关信息该怎么指明检索条件呢?
    //指明联系人姓名不能为空,并且有电话号码的联系人
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))";

    其他参数,如返回字段,结果的排序等,根据实际情况传入自己的设定。
  • 其次,通过游标遍历cursor数组,取得每个联系人的id等
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {... }
  • 再次,用取得的联系人id为条件,检索该联系人的所有电话号码,再进行遍历取得每一个电话号码。
    //根据每个联系人的Id,取得该联系人的所有电话号码
    Cursor phoneCursor = activity.getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, selPhoneCols,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null,
                            null);
  • 最后,关闭游标数组,释放资源。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 智能电话本的代码示例: ```java import java.util.*; public class Phonebook { private Map<String, String> contacts; public Phonebook() { contacts = new HashMap<>(); } public void addContact(String name, String phoneNumber) { contacts.put(name, phoneNumber); } public String getPhoneNumber(String name) { return contacts.get(name); } public List<String> searchContacts(String query) { List<String> matchingContacts = new ArrayList<>(); for (String name : contacts.keySet()) { if (name.toLowerCase().contains(query.toLowerCase())) { matchingContacts.add(name + ": " + contacts.get(name)); } } return matchingContacts; } public static void main(String[] args) { Phonebook phonebook = new Phonebook(); phonebook.addContact("Alice", "555-1234"); phonebook.addContact("Bob", "555-5678"); phonebook.addContact("Charlie", "555-9012"); Scanner scanner = new Scanner(System.in); while (true) { System.out.print("Enter a name to look up, or a search query: "); String input = scanner.nextLine(); if (input.equals("exit")) { break; } String phoneNumber = phonebook.getPhoneNumber(input); if (phoneNumber != null) { System.out.println(input + ": " + phoneNumber); } else { List<String> matchingContacts = phonebook.searchContacts(input); if (matchingContacts.isEmpty()) { System.out.println("No results found."); } else { for (String contact : matchingContacts) { System.out.println(contact); } } } } } } ``` 这个电话本类有以下功能: - 添加联系人 - 通过姓名查找电话号码 - 通过搜索查询查找联系人 在 main 方法中,我们创建了一个 Phonebook 对象,添加了几个联系人,并且允许用户输入姓名或搜索查询来查找联系人。当用户输入 "exit" 时,程序退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值