一、ConTentProvider是什么
ContentProvider 主要用于在不同的应用程序之间实现数据共享的功能。
它提供了一套完整的机制,允许一个程序访问另外一个程序的数据,同时还能保证被访问数据的安全性。目前使用 Content Provider 是 Android 实现跨进称共享数据的标准方式。
二、ConTentResolver是什么
是数据调用者,ContentProvider将数据发布出来后,通过ContentResolver对象结合Uri(全局资源标识符,代表要操作的数据地址)进行调用。
三、URI是什么,标准格式是什么?
Android中的URI即通用资源标识符,Universal Resource Identifier, 简称"URI"。
Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。
URI一般由三部分组成:
1、访问资源的命名机制。
2、资源自身的名称,由路径表示。
3、存放资源的主机名。
content://xxxxxxxx/xxxxxx
四、URIMatcher是什么
UriMatcher 类主要用于匹配Uri.
使用方法如下。
首先第一步,初始化:
UriMatcher uriMatcher;=new UriMatcher(UriMatcher.NO_MATCH);
第二步、注册需要的URI
uriMatcher.addURI("com.example.lianxi.myprovider","student",1);
uriMatcher.addURI("com.example.lianxi.myprovider","teacher",2);
第三步、与已经注册的URI进行匹配
int a=uriMatcher.match(uri);
switch (a){
case 1:
sqLiteDatabase.insert("student",null,contentValues);
break;
}
match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。
五、如何使用ContentProvider(示例,附代码)
首先,我们需要创建一个类继承ContentProvider
public class StudentProvider extends ContentProvider{
然后重写增删改查的方法
package com.example.lianxi;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import static android.support.constraint.Constraints.TAG;
/**
* Created by 龙波 on 2018/6/21.
*/
public class StudentProvider extends ContentProvider{
private MyDBhelper dBhelper;
private SQLiteDatabase sqLiteDatabase;
private UriMatcher uriMatcher;
{
uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.lianxi.myprovider","student",1);
uriMatcher.addURI("com.example.lianxi.myprovider","teacher",2);
}
@Override
public boolean onCreate() {
Log.e(TAG, "onCreate: ??????????????????????????????" );
dBhelper=new MyDBhelper(getContext(),"student_db",null,1);
sqLiteDatabase=dBhelper.getWritableDatabase();
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
Log.e(TAG, "query: ............................" );
Cursor c= sqLiteDatabase.query("student",null,s,strings1,null,null,null);
return c;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.e(TAG, "getType: ........................" );
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
Log.e(TAG, "insert: .........................." );
int a=uriMatcher.match(uri);
switch (a){
case 1:
sqLiteDatabase.insert("student",null,contentValues);
break;
}
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "delete: ........................" );
sqLiteDatabase.delete("student",s,strings);
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "update: ............................" );
sqLiteDatabase.update("student",contentValues,s,strings);
return 0;
}
}
然后在Androidmanifast中注册ContentProvider
<provider
android:authorities="com.example.lianxi.myprovider"
android:name=".StudentProvider"
android:exported="true"></provider>
然后我们就可以在另外的项目中去得到这个ContentProvider,操作数据库
Uri uri= Uri.parse("content://com.example.lianxi.myprovider");
contentResolver=getContentResolver();
contentResolver.insert(uri,new ContentValues());
我们可以通过ContentResolver调用ContentProvider中的增删改查的方法