一,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方法中提示的语句。