android_内容提供者和内容解析者_简单入门
2016-03-15 15:50
549 查看
ContentProvider 内容提供者
一般来说,应用程序创建的数据库只有自己才可以进行读写操作,其他的应用程序不具备这样的权利。但是如果真的想把数据库里面的数据暴露出去,供其他的程序进行CURD操作,那么这个时候就用到了ContentProvider那这个ContentProvider是怎么工作的?现在我们解释一下,
这个ContentProvider是怎么工作的
现在图形化解释一下这个概念:
如果银行行长想要去拿银行里面的钱,但是钱是放在保险库里面的,行长是没有办法直接拿到里面的钱的,但是,保险库里面也有内部人员,只要银行行长和内部人员打交道,通过内部人员,拿钱。这样行长就可以拿到钱了。
在这里钱:表示数据库 内部人员:内容提供者 银行行长:就是外部的APP程序
建立内容提供者
第一步:写一个类继续ContentProvider第二步:在清单文件里面注册,同时要记得叫上authorities(我们把叫做口令)
在这里解释一下authorities的作用,因为别人来访问我们的内容提供,我们不能让任何的APP过来,都是可以访问我的,所以我们内容提供者就设置了一个口令,只有口令输入对了,才可以访问。(注意:直接设置这么一个口令还是不够的,待会后面我会详细的介绍一下)
代码演示内容提供者:
首先我规定一下:这个应用程序的包名是com.exam.bank第一步:
public class BankBackDoor extends ContentProvider { /** 继承之后,发现有四个6个方法,给我们重写, 其中query,insert,update,delete就是对应数据库的 CRUD的方法,同时这个四个方法也对应这内容解析者的query,insert,update,delete, 内容解析者,通过调用自己的CRUD,就可以操作内容提供者的CRUD, 内容通过自己的CRUD又可以去操作自己数据库的CRUD, 所以说: 有一个核心: 到底修改什么数据,执行什么数据插入, 查询,删除,都不能由我们做主,因为我们只是一个跑腿。 我们不生产数据,我们只是数据的搬运工。 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.v("tag", "query"); return null; } @Override public Uri insert(Uri uri, ContentValues values) { Log.v("tag", "insert"); return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.v("tag", "delete"); return i; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.v("tag", "update"); return i; } @Override public boolean onCreate() { return false; } @Override public String getType(Uri uri) { return null; } }
第二步:
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.exam.bank.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="com.exam.bank.BankBackDoor" android:authorities="com.exam.bank.BankBackDoor" ><!--设置口令--> </provider> </application>
这样一个内容提供者我们就写好了.
现在我们设置一下内容解析者把
首先我规定一下这个应用程序的包名是:com.example.bangkBoss
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void insert(View v){ //获取内容解析者 ContentResolver resolver=getContentResolver(); //设置Uri,Uri解析的路径就是内容提供者对外暴漏的口令. //content://是固定好的, //com.exam.bank.BankBackDoor内容提供者设置的口令 Uri uri =Uri.parse("content://com.exam.bank.BankBackDoor"); ContentValues values=new ContentValues(); /**调用内容解析者里面的方法,只要我们使用insert方法, 这个方法就会去操作内容提供者里面的insert方法, 而内容提供者而就会调用自己内部的方法(就会去操作数据库). 这样通过这样的调用, 外部的APP就可以访问,其他APP的数据库了 */ resolver.insert(uri, values); } public void delete(View v){ ContentResolver resolver=getContentResolver(); Uri uri =Uri.parse("content://com.exam.bank.BankBackDoor"); resolver.delete(uri, null, null); } public void update(View v){ ContentResolver resolver=getContentResolver(); Uri uri =Uri.parse("content://com.exam.bank.BankBackDoor"); ContentValues values=new ContentValues(); resolver.up bc31 date(uri, values, null, null); } public void select(View v){ ContentResolver resolver=getContentResolver(); Uri uri =Uri.parse("content://com.exam.bank.BankBackDoor"); resolver.query(uri, null, null, null, null); } }
一些定义的解析:
Uri 在java基础我们知道是资源定位符,在这里,我们就用来匹配口令的,这个口令是内容提供者写好。我们只要和内容提供者的提供的口令一致就可以的了,content://
指的是规则,例如http://www.baidu.com一样,符合http://规则。content://
就是我们这里口令的规则,这个是定义死的。记住就行了。
Resolver,里面就有insert(),updata(),delete(),query()等方法,他们都是对应着内容提供者的方法。所以我们内容解析者操作自己里面的方法,就可以执行到内容提供者里面的方法。
ContentValues 这个参数,其实就是用来存储数据的,是键值对的形式存在的。在SQLite里面有详细的介绍
后面会演示的
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories