ContentProvider是什么?
ContentProvider(内容提供者)在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。
特点:
ContentProvider是Android中的四大组件之一,可以将应用中的数据对外进行共享;
ContentProvider将数据的访问方式统一,不必针对不同数据类型采取不同的访问策略;
ContentProvider将数据封装,只暴露出我们希望提供给其他程序的数据;
ContentProvider中数据更改可被监听。
二、ContentResolver是什么?
ContentResolver(内容解析者)用来处理ContentProvider提供的内容,外界的程序通过ContentResolver可以访问ContentProvider提供的数据;
三、URI是什么,标准格式是什么?
URI:类似于URL,但是URI的目的是为了能够根据URI以及调用的方法来决定怎样操作数据,比如:uri=”…./person”,调用insert方法,则表示需要插入一perso记录;
标准格式:
(1)以 content:// 开头;
(2)模式为:content://authorities/path;其中authorities类似于域名或IP,用来标识操作哪个ContentProvider,path表示具体的操作;
demo:
content://org.xiazdong.providers.personprovider/person 表示调用“org.xiazdong.providers.personprovider”的方法,操作person数据;
四、UriMatcher是什么?
当要使用多个URI时,可以使用其筛选出不同的URI
一般直接写成静态代码块,随着类得加载自动加载,不用调用
private UriMatcher uriMatcher;
{
uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
//通过对象的addURI方法定义单条和批量的uri的规则
uriMatcher.addURI("com.android.usersprovider","sel1",1);
uriMatcher.addURI("com.android.usersprovider","sel2",2);
}
//这里我拿了其中的insert方法做例子
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.e(TAG,"insert..........");
int result=uriMatcher.match(uri);
switch (result){
case 1:
sqLiteDatabase.insert("Users",null ,values);
break;
case 2:
break;
default:
break;
}
return null;
}
五、如何使用ContentProvide(demo)
简介:通过ContentProvider处理数据库的增删改查,跨程序的操作
创建一个类继承ContentProvider,并实现里面的六个方法
package com.example.fpl.week3application;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Paint;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
public class UserscontantProvide extends ContentProvider {
private String TAG="UserscontantProvide";
private UserSQLiteHelper userSQLiteHelper;
private SQLiteDatabase sqLiteDatabase;
private UriMatcher uriMatcher;
{
uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.android.usersprovider","sel1",1);
uriMatcher.addURI("com.android.usersprovider","sel2",2);
}
@Override
public boolean onCreate() {
userSQLiteHelper=new UserSQLiteHelper(getContext(),"USER_DB",null,1);
sqLiteDatabase=userSQLiteHelper.getWritableDatabase();
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Cursor cursor= sqLiteDatabase.query("Users",null,null,null,null,null,null);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.e(TAG,"insert..........");
int result=uriMatcher.match(uri);
switch (result){
case 1:
sqLiteDatabase.insert("Users",null ,values);
break;
case 2:
break;
}
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
sqLiteDatabase.delete("Users",selection,selectionArgs);
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
sqLiteDatabase.update("Users",values,selection,selectionArgs);
return 0;
}
}
2.注册ContentProvider组件(在ManiFest文件里);
<provider
android:authorities="com.android.usersprovider"
android:name=".UserscontantProvide"
android:exported="true"></provider>
3.在另一个程序里使用ContentResolver处理
package com.example.fpl.contentproviderapplication;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button buttonadd;
private Button buttondel;
private Button buttonfix;
private Button buttonsea;
private EditText name;
private EditText age;
private ListView listView;
private THER2Adapter therAdapter;
private List<User2Bean> beanList=new ArrayList<>();
private Uri uri;
private Uri uri2;
private ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uri=Uri.parse("content://com.android.usersprovider/sel1");
uri2=Uri.parse("content://com.android.usersprovider/sel2");
contentResolver=getContentResolver();
bindID();
}
private void bindID() {
name=findViewById(R.id.username_ET);
age=findViewById(R.id.age_ET);
buttonadd=findViewById(R.id.ADD_BTN);
buttondel=findViewById(R.id.DEL_BTN);
buttonfix=findViewById(R.id.FIX_BTN);
buttonsea=findViewById(R.id.SEA_BTN);
listView=findViewById(R.id.THER_LV);
buttonadd.setOnClickListener(this);
buttondel.setOnClickListener(this);
buttonfix.setOnClickListener(this);
buttonsea.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.ADD_BTN:
usersADD();
break;
case R.id.DEL_BTN:
usersDEL();
break;
case R.id.FIX_BTN:
usersFIX();
break;
case R.id.SEA_BTN:
usersSEA();
break;
}
}
private void usersADD() {
String username=name.getText().toString();
int userage= Integer.parseInt(age.getText().toString());
ContentValues values=new ContentValues();
values.put("usersname",username);
values.put("usersage",userage);
contentResolver.insert(uri,values);
}
private void usersDEL() {
String username=name.getText().toString();
String userage=age.getText().toString();
contentResolver.delete(uri,"usersname=?and usersage=?",new String[]{username,userage});
}
private void usersFIX() {
String username=name.getText().toString();
String userage=age.getText().toString();
ContentValues values=new ContentValues();
values.put("usersname",username);
values.put("usersage",userage);
contentResolver.update(uri,values,"usersname=?and usersage=?",new String[]{username,userage});
}
private void usersSEA() {
beanList.clear();
Cursor cursor=contentResolver.query(uri,null,null,null,null);
cursor.moveToFirst();
do {
int id=cursor.getInt(0);
String name=cursor.getString(1);
int age=cursor.getInt(2);
User2Bean student_bean=new User2Bean(name,age);
beanList.add(student_bean);
therAdapter=new THER2Adapter(this,beanList );
}while (cursor.moveToNext());
listView.setAdapter(therAdapter);
}
}