文档章节

Android使用系统的Content Provider

Freewheel
 Freewheel
发布于 2015/05/28 10:44
字数 544
阅读 16
收藏 0
Content Provider的Uri的格式为:

  content://<authority>/<data_path>/id
例子:
content://media/internal/images   图片
content://contacts/people              联系人
content://browser/bookmarks       浏览器书签


public class MainActivity extends ListActivity {
 
 Cursor Name_cursor;
 //Contact_data[] contact_datas;
 List<Contact_data> contact_datas = new ArrayList<>();
 //Cursor Phone_cursor;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // setContentView(R.layout.contact_layout);
 //setContentView(R.layout.activity_main);
 
 //Uri allContacts = Uri.parse("content://contacts/people"); 与下一行效果一样
 Uri allContacts = ContactsContract.Contacts.CONTENT_URI;
 String[] projection = new String[]{
 ContactsContract.Contacts._ID,
 ContactsContract.Contacts.DISPLAY_NAME,
 ContactsContract.Contacts.HAS_PHONE_NUMBER
 };
 if (Build.VERSION.SDK_INT < 11) {
 Name_cursor = managedQuery(allContacts, null, null, null, null);
 } else {
 CursorLoader cursorLoader = new CursorLoader(this, allContacts, projection, ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?", new String[]{"%Li%"}, ContactsContract.Contacts.DISPLAY_NAME + " DESC");
 Name_cursor = cursorLoader.loadInBackground();
 }
 
 Name_cursor.moveToFirst();
 
 // Toast.makeText(this, "Name cursor: " + Name_cursor.getCount() + "\n" + Name_cursor.getString(Name_cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) + "\n" + Name_cursor.getString(Name_cursor.getColumnIndex(ContactsContract.Contacts._ID)), Toast.LENGTH_LONG).show();
 /* 方法一: 使用 SimpleCursorAdapter ,有局限性
 String[] columns = new String[]{
 ContactsContract.Contacts.DISPLAY_NAME,
 ContactsContract.Contacts._ID
 };
 
 int[] views = new int[]{R.id.contactName, R.id.contactID};
 
 SimpleCursorAdapter simpleCursorAdapter;
 
 simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.activity_main, Name_cursor, columns, views, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
 
 this.setListAdapter(simpleCursorAdapter);
 
 方法二:使用自定义的Adapter
 */
 MyContactAdapter myContactAdapter = new MyContactAdapter(this);
 
 PrintContacts(Name_cursor);
 
 this.setListAdapter(myContactAdapter);
 
 }
 
 
 private void PrintContacts(Cursor cursor) {
 if (cursor.moveToFirst()) {
 do {
 
 String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
 String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
 
 Log.v("Content Provider", contactId + "," + contactName);
 
 int hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
 if (hasPhone == 1) {
 Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
 String contactPhone = "";
 while (cursorPhone.moveToNext()) {
 contactPhone = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
 Log.v("Content Provider", contactPhone);
 }
 cursorPhone.close();
 Contact_data contact_data = new Contact_data(contactName, contactPhone, contactId);
 
 contact_datas.add(contact_data);
 }
 } while (cursor.moveToNext());
 }
 }
 
 public class MyContactAdapter extends BaseAdapter {
 
 Context context;
 
 public MyContactAdapter(Context c) {
 context = c;
 }
 
 @Override
 public int getCount() {
 return contact_datas.size();
 }
 
 @Override
 public Object getItem(int position) {
 return contact_datas.get(position);
 }
 
 @Override
 public long getItemId(int position) {
 return position;
 }
 
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 LinearLayout linearLayout = null;
 if (convertView == null) {
 linearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.contact_layout, null);
 } else {
 linearLayout = (LinearLayout) convertView;
 }
 
 Contact_data mydata = (Contact_data) this.getItem(position);
 String contact_id = mydata.id;
 String contact_name = mydata.name;
 String contact_phone = mydata.phone;
 
 TextView id_text = (TextView) linearLayout.findViewById(R.id.mycontactId);
 id_text.setText(contact_id);
 TextView name_text = (TextView) linearLayout.findViewById(R.id.mycontactName);
 name_text.setText(contact_name);
 TextView phone_text = (TextView) linearLayout.findViewById(R.id.mycontactPhone);
 phone_text.setText(contact_phone);
 return linearLayout;
 }
 }
 
}




public class Contact_data {
 String name;
 String phone;
 String id;
 
 public Contact_data(String name, String phone, String id){
 this.id = id;
 this.name = name;
 this.phone = phone;
 }
}




主要用到的类: Cursor List < Contact_data > Uri   CursorLoader
主要用到的方法: CursorLoader()构造方法 loadInBackground () moveToFirst () setListAdapter() getString() getColumnIndex() getContentResolver () query()

关键:  使用  CursorLoader()构造方法 和  loadInBackground () 查询内容,返回Cursor对象 (在后台线程中执行cursor的查询,不会阻塞用户界面);
  在查询phone number中,使用了 getContentResolver (). query(...). (联系人的名字等信息和电话号码存放在2个不同的tables里,所以需要2次查询);
  在Cursor类中检索内容,必须已知内容的type进而使用对应的getXxx()方法(如 getString(),getInt()),参数为columnIndex 可用 getColumnIndex() 进行查询。







© 著作权归作者所有

Freewheel
粉丝 10
博文 83
码字总数 48265
作品 0
普陀
程序员
私信 提问
Android基础之应用程序组件

Android应用程序由若干个不同类型的组件组合而成,每一个组件具有其特定的安全保护设计方式,它们的安全直接影响到应用程序的安全。Android应用程序组件的主要类型有:活动(Activity),服务...

柳哥
2014/11/28
0
0
创建ContentProvider的详细步骤

Content Provider管理中央存储库的数据的访问, 你在Android程序中实现一个或者多个Provider, 连同清单文件中的元素. 其中一个类实现了ContentProvider子类, 这个子类是你的Provider和其他程序...

等待流星
2014/01/04
0
0
Android本地的Content Provider

Android本地的Content Provider Android 暴露了许多 Content Provider 来访问本地的数据库。 你可以使用之前描述的技巧来使用本地的 Content Provider 。可变通的地方, android.provider 类...

晨曦之光
2012/03/05
684
0
Android基础 : ContentProvider和getContentResolver

安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器。 关于SqlLite数据库的文章可...

墨梅
2014/10/23
0
0
Android应用程序的组成部分

Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一个组件和它们之间的交互方式,还用于指定应用程序元数据,其硬件和平台要求,外部库以...

柳哥
2014/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linq两表联查结果集处理

全局定义一个同结果集类型的变量: var strQuery =(new int[] { 1 }).Select(x => new { DispLevel = "empty", Separator ="empty", GrpShortCut......

南风末
9分钟前
1
0
AJAX跨域调用相关知识-CORS和JSONP(引)

AJAX跨域调用相关知识-CORS和JSONP 1、什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议、域名、端口)的内容。 但是我们项目开发过程中,经...

辉煌霸猪
14分钟前
0
0
Http协议详解

1.简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP基于TCP/IP通信协议来传递数据。 ...

榴莲黑芝麻糊
18分钟前
2
0
Windows Terminal 设置背景图片

效果见文末,三步即可 一、打开配置文件位置 %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\RoamingState 二、将要设置的图片放入本目录(RoamingState) 三、修改配置文...

DAOYUAN0626
18分钟前
4
0
Linux系统发现新恶意软件

安全研究人员发现了一种新的Linux恶意软件,它似乎是由中国黑客创建的,并被用作远程控制受感染系统的手段。 这个恶意软件命名为HiddenWasp,由用户模式rootkit,木马和初始部署脚本组成。该...

Linux就该这么学
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部