一,ContentProvider详情
ContentProvider是一个APP的对外接口,其他第三方APP或者本身APP通过Uri格式进行访问,得到自己想要的数据,实现数据间的共享功能。
Uri的格式:<srandard_prefix>://<authority>/<data_path>/<id>
srandard_prefix:这里用content://代表
authority:ContentProvider的名称,例如:com.xxx.mycontentprovider
data_path:请求的数据类型
id:指定请求的特定数据
例子如:
content://com.xxx.mycontentprovider/userdemo
content://media/internal/images 这个URI将返回设备上存储的所有图片
content://contacts/people/ 这个URI将返回设备上的所有联系人信息
content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)
二,ContentProvider使用方法
这里我使用的是数据库共享
1,创建并使用A应用,创建数据库,并添加正删改查功能
2,创建并使用B应用,访问A应用的数据库数据,也添加增删改查功能
A应用
数据库的创建:User.db
/**
* 创建新类继承ContentProvider
*/
public class UserProvider extends ContentProvider {
private MyDatabaseHelper dbHelper; //用于创建数据库
public static final String AUTHORITY = "com.xxx.mycontentprovider"; //创建authority
//创建UriMatcher对象
private static UriMatcher uriMatcher;
public static final int USER_DIR = 0;
public static final int USER_ITEM = 1;
//创建静态代码块
static {
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//添加两个URI筛选
uriMatcher.addURI(AUTHORITY , "user" , USER_DIR);
//使用通配符#,匹配任意数字
uriMatcher.addURI(AUTHORITY , "user/#" , USER_ITEM);
}
public UserProvider() {
Log.e("TAG", "DatabaseProvider: ");
}
@Override
public boolean onCreate() {
//创建数据库
dbHelper = new MyDatabaseHelper(getContext() , "User.db" , null , 1);
Log.e("TAG", "onCreate()-->创建成功 ");
return false;
}
//查询数据
@Override
public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
//通过两种方式的查询
switch (uriMatcher.match(uri)){
case USER_DIR:
cursor = db.query("user" , projection , selection , selectionArgs , null , null , sortOrder);
break;
case USER_ITEM:
String queryId = uri.getPathSegments().get(1);
cursor = db.query("user" , projection , "id=?" , new String[]{queryId} , null , null , sortOrder);
break;
}
return cursor;
}
@Override
public String getType( Uri uri) {
Log.e("TAG", "getType");
return null;
}
//插入数据
@Override
public Uri insert( Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
//因为插入数据时,两条命令语句一样的
switch (uriMatcher.match(uri)){
case USER_DIR:
case USER_ITEM:
long userid = db.insert("user" , null , values);
break;
}
return null;
}
//删除数据
@Override
public int delete( Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deleteInt = 0;
switch (uriMatcher.match(uri)){
case USER_DIR:
//参数1:表名 参数2:约束删除列的名字 参数3:具体行的值
deleteInt = db.delete("user" , selection , selectionArgs);
break;
case USER_ITEM:
//根据id删除
String deleteId = uri.getPathSegments().get(1);
deleteInt = db.delete("user" , "id=?" , new String[]{deleteId});
break;
}
return deleteInt;
}
//更新表中某元素
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateint = 0;
switch (uriMatcher.match(uri)){
case USER_DIR:
updateint = db.update("user" , values , selection , selectionArgs);
break;
case USER_ITEM:
String updateId = uri.getPathSegments().get(1);
updateint = db.update("user" , values , "id=?" , new String[]{updateId});
break;
}
return updateint;
}
}
主函数Activity中进行增删改查
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.et);
}
//增
public void onadd(View view ){
String str = editText.getText().toString().trim();
String[] strs = str.split(",");
int phone = Integer.parseInt(strs[0]);
int age = Integer.parseInt(strs[1]);
String name = strs[2];
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
ContentValues values = new ContentValues();
values.put("phone" , phone);
values.put("age" , age);
values.put("name" , name);
//获得ContentResolver对象,调用方法
getContentResolver().insert(uri , values);
}
//删
public void ondetele(View view ){
String name = editText.getText().toString().trim();
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
getContentResolver().delete(uri , "name=?" , new String[]{name});
}
//改
public void ongai(View view){
String updatename = editText.getText().toString().trim(); //要改成的name
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
ContentValues values = new ContentValues();
values.put("name" , updatename);
//修改name=kk的元素
getContentResolver().update(uri , values , "name=?" ,new String[]{"kk"} );
}
//查
public void onquery(View view){
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
Cursor cursor = getContentResolver().query(uri , null , null , null ,null);
cursor.moveToFirst();
//打印所有从数据库里找出来的
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.e("TAG", name );
}while (cursor.moveToNext());
cursor.close();
}
}
增加onAdd()
如图:
使用查的onquery()进行打印,查看是否成功
删ondelete
改ongai(),uu-->bb
注意:在AndroidManifest.xml中还要添加
<provider
android:authorities="com.xxx.mycontentprovider"
android:name=".UserProvider"/>
如果第三方APP应用要访问此APP的应用的数据库时,差不多也是这样
B应用中主Activity
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)findViewById(R.id.et);
}
//增
public void onadd(View view ){
String str = editText.getText().toString().trim();
String[] strs = str.split(",");
int phone = Integer.parseInt(strs[0]);
int age = Integer.parseInt(strs[1]);
String name = strs[2];
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
ContentValues values = new ContentValues();
values.put("phone" , phone);
values.put("age" , age);
values.put("name" , name);
//获得ContentResolver对象,调用方法
getContentResolver().insert(uri , values);
}
//删
public void ondetele(View view ){
String name = editText.getText().toString().trim();
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
getContentResolver().delete(uri , "name=?" , new String[]{name});
}
//改
public void ongai(View view){
String updatename = editText.getText().toString().trim(); //要改成的name
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
ContentValues values = new ContentValues();
values.put("name" , updatename);
//修改name=kk的元素
getContentResolver().update(uri , values , "name=?" ,new String[]{"kk"} );
}
//查
public void onquery(View view){
Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
Cursor cursor = getContentResolver().query(uri , null , null , null ,null);
cursor.moveToFirst();
//打印所有从数据库里找出来的
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.e("TAG", name );
}while (cursor.moveToNext());
cursor.close();
}
}
注意:因为第三方调取,原来的A应用的AndroidManifest.xml要修改
<provider
android:authorities="com.xxx.mycontentprovider"
android:name=".UserProvider"
android:enabled="true"
android:exported="true"
/>