整体思路:
ContentProvider和ContentResolver的使用
要使用内容提供者和内容获取者,就必须要有两个应用
1个应用是内容提供者(这里面有数据库,有数据的增删改查的方法,uri,有ContentProvider),另外1个应用是内容接收者(根据内容提供者提供的uri对提供者的数据进行相应的操作,这里有ContentResolver)。
ContentProvider(内容提供者)
首先建立一个Module命名为ContentProviderDemo,在它下面建立两个包,一个是database包,另外一个是provider包。(因为内容提供者没有数据展示,所以没有布局文件)。ContentProvider就是讲自己数据库里的数据提供出去。
1.初始化数据库和数据,并提供增删改查的方法。
在database包下建立一个MyDataBase.java的类并继承SQLiteOpenHelper。增加构造函数并重写初始化数据库和升级数据库的两个方法。代码如下。
public class MyDataBase extends SQLiteOpenHelper {
//构造函数有四个参数,第一个是上下文,第二个是数据库名,第三个是游标工厂为null就行,第四个是数据库版本,默认为1。前期固定数据库名和版本号。
private static final String DBNAME="Students";
private static final int VERSION=1;
public DataBaseOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
//在onCreate()方法中初始化数据库、建表和添加初始数据。
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table student(id Integer primary key , name varchar(20),sex varchar(2),age Integer);";
//执行sql语句建表
db.execSQL(sql);
//初始化数据
sql = "insert into student values(1,'貂蝉','女',20)" ;
db.execSQL(sql);
sql = "insert into student values(2,'赵云','男',24)" ;
db.execSQL(sql);
sql = "insert into student values(3,'小乔','女',21)" ;
db.execSQL(sql);
}
//升级数据库是使用onUpgrade()方法;
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
2.编写一个MyContentProvider的类继承ContentProvider将自己的数据提供出去。
继承ContentProvider后要重写6个方法,除了增删改查四个之外还有onCreate() 和 getType(Uri uri)方法。以下是详细代码。
public class MyContentProvider extends ContentProvider {
//声明数据库操作对象
DataBaseOpenHelper helper ;
//声明Uri匹配对象
UriMatcher matcher ;
//声明author认证(钥匙)
private static final String AUTHORITIES = "com.qianyuaixi.mycontentprovider" ;
//声明Uri匹配码,由内容获取者传过来的Uri请求经过Uri匹配对象匹配过后获得
private static final int ALL = 1 ;
private static final int INSERT = 2 ;
private static final int DELETE= 3 ;
private static final int UPDATA = 4 ;
//重写onCreate()方法,当应用被安装,创建ContentProvider的时候,就会被调用。主要用来初始实例化数据库操作对象、初始非法URI时的返回码和自定义URI匹配对象匹配过后的匹配码。
@Override
public boolean onCreate() {
//实例化helper
helper = new DataBaseOpenHelper(getContext());
//参数为传入非法URI时的返回码
matcher = new UriMatcher(UriMatcher.NO_MATCH);
//为contentProvider添加可以访问的URI
/**
* 第一个参数:认证
* 第二个参数:路径 path
* 第三个参数:匹配返回码
*/
matcher.addURI(AUTHORITIES,"student/all",ALL);
matcher.addURI(AUTHORITIES,"student/insert",INSERT);
matcher.addURI(AUTHORITIES,"student/delete",DELETE);
matcher.addURI(AUTHORITIES,"student/updata",UPDATA);
return false;
}
/**
* 内容提供者对外所提供的查询功能
* @param uri 统一资源标识符
* @param projection 查询的列的名字组成的数组
* @param selection 查询条件
* @param selectionArgs 查询条件的参数组成的数组
* @param sortOrder 排序条件
* @return
*/
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
//利用URI匹配对象将传过来的uri匹配出对应的匹配码
int code = matcher.match(uri);
//获得数据库操作对象
SQLiteDatabase db = helper.getReadableDatabase();
//声明要返回的结果集。
Cursor c = null;
switch (code){
case ALL:
c = db.query("student",projection,selection,selectionArgs,null,null,sortOrder);
break ;
}
return c;
}
//很少使用
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
/**
* 内容提供者对外所提供的插入数据的功能
* @param uri 统一资源标识符
* @param values 插入的数据
* @return 返回一个统一资源标识符
*/
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
//利用URI匹配对象将传过来的uri匹配出对应的匹配码
int code = matcher.match(uri);
//获得数据库操作对象
SQLiteDatabase db = helper.getWritableDatabase();
switch (code){
case INSERT :
long rawId = db.insert("student","id",values);
//将rawId与uri进行拼接形成新的URI,内容获取者可利用此URI获得rawId。
uri = ContentUris.withAppendedId(uri,rawId);
// System.out.println("InsertUri-->"+uri);
break;
}
return uri;
}
/**
* 内容提供者对外所提供的删除数据的功能
* @param uri 统一资源标识符
* @param selection 删除条件
* @param selectionArgs 删除条件的参数组成的数组
* @return
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//利用URI匹配对象将传过来的uri匹配出对应的匹配码
int code = matcher.match(uri);
//获得数据库操作对象
SQLiteDatabase db = helper.getWritableDatabase();
int rawId=0;
switch (code){
case DELETE :
rawId= db.delete("student",selection,selectionArgs);
break;
}
return rawId;
}
/**
* 内容提供者对外所提供的修改数据的功能
* @param uri 统一资源标识符
* @param values 修改的数据
* @param selection 修改条件
* @param selectionArgs 修改条件的参数组成的数组
* @return
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
//返回的uri是传入的uri+/+db.insert()的返回值
int code = matcher.match(uri);
//获得数据库操作对象
SQLiteDatabase db = helper.getWritableDatabase();
int rawId=0;
switch (code) {
case UPDATA :
rawId= db.update("student",values,selection,selectionArgs);
break;
}
}
}
以上就是继承ContentProvider所重写的6个方法
3.在manifest.xml文件中为该ContentProvider进行注册
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soft.qianyu.contentproviderdemo">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="com.zdsoft.mycontentprovider" android:name="com.soft.qianyu.contentproviderdemo.provider.MyContentProvider"
android:exported="true"/>
</application>
</manifest>
主要的代码是在<activity>和<application>之间插入如下代码。
<provider android:authorities="com.zdsoft.mycontentprovider" android:name="com.soft.qianyu.contentproviderdemo.provider.MyContentProvider"
android:exported="true"/>
至此,ContentProvider的类就完成了。接来下编写ContentResolver。
本文介绍了ContentProvider和ContentResolver在Android应用间数据交换中的作用。通过创建一个ContentProviderModule,分为database和provider两个包,实现数据库的初始化和数据操作。ContentProvider负责提供数据,包括数据库的增删改查方法,以及onCreate()和getType(Uri uri)的重写。同时,文章提到了在AndroidManifest.xml中注册ContentProvider的步骤。接下来的部分将介绍ContentResolver如何根据ContentProvider提供的URI进行数据操作。
548

被折叠的 条评论
为什么被折叠?



