一,ContentProvider介绍
ContentProvider内容提供者,是androidAPP四大组件之一。是一种数据存贮访问通道,在你无需了解存储细节的时候就可以方便的访问数据。为什么会有这样的机制呢?在android中没有提供一个公共区域供不同的程序共享访问。我们知道android系统是基于Linux系统的,我们的每一个程序都有独立的账户,拥有独立的虚拟机。我们的android提供了SQLite数据库作为数据存储,但是只能够程序本身访问,试想一下如果我们要写一段发短信的程序,这个时候我们需要访问通讯录存储的联系人那么我们应该怎么办呢?这个时候就可以使用ContentProvider的机制来实现。另外,ContentProvider在系统启动的时候就会自动实例化,无需等待被调用的程序启动我们就可以访问它的数据。
这就是ContentProvider所设计的作用。ContentProvider可以帮助我们安全的实现进程间数据的访问,也是唯一的进程间数据访问的方式(注意和IPC进程间通讯区分,这里的数据主要是指磁盘数据)。
1,实现原理示意图
2,返回的数据模型示意图,返回一个Cursor对象,就是下面的表。
二,如何使用
1,uri解释
第一部分content://固定的标示
第二部分com.lijp.provider.*/在mainfest文件中配置的路径,相当于数据库的路径
第三部分,person相当于访问数据库的表明
第四部分,相当于表的id
2,自定义一个类,继承自系统的ContentProvider
package com.example.cdy.myapplication; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.widget.Toast; /** * Created by cdy on 2015/12/13. * 定义自己的ContentProvider * 1,继承系统的ContentProvider类 * 2,实现父类的方法 */ public class MyContentProvider extends ContentProvider { public boolean onCreate() { return false; } /* *查询方法,返回一个Cursor对象, * uri:在manifest文件中注册的地址。 android:authorities="com.example.cdy" * projection:一组查询的列名 * selection: 查询的条件 * selectionArgs:查询的条件参数 * sortOrder:排序 * */ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Toast.makeText(getContext(),"打印结果",Toast.LENGTH_LONG).show(); return null; } /* * 返回指定uri的数据类型 * */ public String getType(Uri uri) { return null; } /* *插入指定uri的数据 * values:插入的数据 * */ public Uri insert(Uri uri, ContentValues values) { return null; } /* * 删除指定uri的数据 * selection:删除的条件 * selectionArgs:删除的条件参数 * */ public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } /* * 更新指定uri的数据 * values:需要更新的数据 * selection:更新的条件 * selectionArgs:更新的条件参数 * */ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }3,在mainfest.xml中注册
<!--在Manifest中注册定义的ContentProvider authorities:提供访问的地址 name:定义的类名的项目地址,<package>.<class.name>我这里开发使用的android studio自动识别--> <provider android:authorities="com.example.cdy" android:name=".MyContentProvider"> </provider>4,使用系统提供的ContentResolver调用定义的provider
button = (Button)findViewById(R.id.test_provider); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* * 系统提供了resolver,供我们调用provider * */ ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(Uri.parse("content://com.example.cdy"),null,null,null,null); } });5,界面输出了定义的MyContentProvider中Query方法中提示的语句。