android中ContentProvider
来源:互联网 发布:战后心理创伤知乎 编辑:程序博客网 时间:2024/06/05 19:26
ContentProvider是一个不同应用间进行数据共享的标准API,我们通过ContentResolver来操作ContentProvider提供的数据。它们之间通过被ContentProvider绑定的uri来间接进行操作数据。
而uri的格式是content://host:port/path,其中对于ContentProvider来说,content://是固定的,不能更改,就像如果我们要上网,就会输入http://一样,但如果不是用ContentProvider,就可以是别的格式,列如访问手机中的某一首歌曲,则Uri格式是file:///storage/sdcard0/平凡之路.mp3,通常我们都会用uri.parse()将普通字符串转换为uri的标准格式。
这里附上一段代码,是照着书上敲的关于调用系统联系人相关信息的,通过这个列子可以对其中一些知识更好理解。
public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case (PICK_CONTACT): if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData();//其实就是获得标识ContentProvider的Uri,即获得我们要操纵数据的Uri CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);//创建一个CursorLoader Cursor cursor = cursorLoader.loadInBackground();//获得符合条件的查询结果 if (cursor.moveToFirst()) { String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); String phoneNumber = "暂时未输入号码"; Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, contactId,null,null);// ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);这里是通过生成一个contentprovider,调用它的查询方法来获得数据 if (phones.moveToFirst()) { phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phones.close(); EditText show = (EditText) findViewById(R.id.show); show.setText(name); EditText phone = (EditText) findViewById(R.id.phone); phone.setText(phoneNumber); } cursor.close(); } break; } }
我们在oncreate()方法中通过intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("vnd.android.cursor.item/phone");startActivityForResult(intent, PICK_CONTACT)可以找到intent对应的系统组件,通过上面的OnActivityResult()得到返回的联系人信息。关于这两个函数以及其中的RequestCode及ResultCode,这里推荐一篇博文,写的很清楚,http://www.cnblogs.com/linjiqin/archive/2011/06/03/2071956.html。
上面代码中提到了CursorLoader,首先要明白这里的cusor与数据库中的cursor不同,数据库中的是代表游标,我感觉有点像指针,可以移动来指向不同的数据,而这里的则相当于一个Result,即结果集。我觉得可以把cursorloader看做是一个查询工具,我们通过这个查询工具来从提供的Uri中获得数据。cursorloader继承自AsynctaskLoader,而AsyntaskLoader是一个异步查询机制,Asyntaskloader继承自loader。
这里提到一个概念,异步查询,看到过一个很形象的描绘,好比你在打游戏,当你点击后,画面上什么都没有,过了一会,图片动画人物都同时加载出来了,这就是同步。但如果你先看到一个人物,当人物运行一会后,图片也慢慢出来了,这时就是异步。
在cursor中有movetoXXX()方法,要注意这些方法中,数据都是先指向第一个数据之前,这样我们才可以通过move类型的方法去移动。关于cursor,这里也推荐一篇文章,不过自己还没看太懂,就不做赘述了http://www.sxrczx.com/pages/kohoh1992.github.io/cursor-auto-sync/index_1431878338570.html。
ps:关于这一节还有很多知识,现在还没理解的很清楚,只能后续补充了。。。
上面提到的第一段代码,现在也还有问题,每次选择联系人时,都会显示同一个号码
0 0
- Android中ContentProvider简介
- Android中ContentProvider简介
- android中ContentProvider学习心得
- android中ContentProvider
- Android中ContentProvider简介
- Android中ContentProvider案例
- Android中contentprovider详解
- android中contentProvider初步学习
- Android中ContentProvider组件详解
- Android中ContentProvider的使用
- Android中contentProvider的用途
- android中contentProvider初步学习
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider组件详解
- Android中ContentProvider详解例程
- Android中ContentProvider组件详解
- GDOI'2016市选day1 —— 组题(pro)
- hdu 5651 反省
- 自考学习之操作系统概论
- hadoop源代码分析(一)从wordCount开始,剖析mapreduce的运行机制
- 30个你不可不知的CSS选择器
- android中ContentProvider
- 孙敬哲的c++上机实验2-2
- Android权限
- zzuoj-10453: 补题栈
- 跨域中的crossdomain文件
- Python2.7写入中文数据进sqlite3报错
- 科技公司钟爱的50款开源工具--转载
- servlet错误:HTTP Status 405 - HTTP method GET is not supported by this URL
- 反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212