她是用来为其他应用程序暴露数据,并且提供数据操作方法的一个类,就比如说是手机自带的通讯录,短信等这些应用都用contentprovider暴漏了。
需要用到一个UriMatcher,他是帮助contentprovider解析uri的,uri是统一资源标识符,就是类似网址一样的东西。
1怎么创建内容提供者
1.1创建一个类(类名最好是以Provider结尾)继承ContentProvider
public class MyContentProvider extends ContentProvider {
1.2一旦创建了内容提供者就得去清单文件注册
<provider
android:name="us.mifeng.contentprovider.MyContentProvider"
android:authorities="us.mifeng.biaogeshuaige"
android:exported="true"
></provider>
1.3UriMatcher是帮助内容提供者匹配uri的一个类,需要用到uriMatcher了,创建一个UriMatcher
//创建一个urimatcher 他的意思就是如果匹配失败,返回一个-1
private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
1.4创建静态代码块,定义匹配规则
//创建静态代码块,定义匹配规则
static{
//其实是定义规则呢
matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/update",QUERYSUCCESS);
matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/queryAll",PERSON_UPDATE_CODE); }
1.5把其他的方法实现即可(增删改查 type)
实现的时候,先把传过来的uri匹配一下,如果匹配成功就执行,如果不成功,就报异常
@Override
public Cursor query(Uri uri, //是传进来的uri
String[] projection,//想要查询的列名,是String数组类型
String selection,//查询的条件
String[] selectionArgs,//查询的条件的参数
String sortOrder) {//按照排序的参数
int match = matcher.match(uri);//匹配了下传进来的uri,
//如果匹配成功就是定义好的成功吗,如果匹配失败就是-1
//判读是否匹配成功
if (match==QUERYSUCCESS) {
Cursor cursor = db.query("lol",
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
return cursor;
}
else {
throw new IllegalArgumentException("叫你传没用数据,报错了把!!!");
}
}
2.从内容提供者处拿数据。
如果你想访问contentprovider的内容,那么一定用ContentResovler内容解析者,而这个怎么获取?不是new,而是直接从上下文get。
//获取内容解析者
ContentResolver contentResolver = getContentResolver();
2.1操作数据,就是用contentresolver来掉内容提供者定义好的方法String
str="content://us.mifeng.biaogeshuaige/lol";
Uri uri = Uri.parse(str);
String[] projection;
Cursor cursor = contentResolver.query(uri,
null,
null,
null,
null);
// if (cursor!=null&&cursor.getCount()>0) {
while(cursor.moveToNext()){
String hero = cursor.getString(cursor.getColumnIndex("hero"));
String life = cursor.getString(cursor.getColumnIndex("life"));
String type = cursor.getString(cursor.getColumnIndex("type"));
System.out.println(hero+life+type+"hehehehehehe");
}
// }
搞定!!
详情代码:
创建ContentProvider的程序:
public class MyContentProvider extends ContentProvider {
//创建一个urimatcher 他的意思就是如果匹配失败,返回一个-1
private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERYSUCCESS=1;
private static final int PERSON_UPDATE_CODE=1;
private SQLiteDatabase db;
//创建静态代码块,定义匹配规则
static{
//其实是定义规则呢
matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/update",QUERYSUCCESS);
matcher.addURI("com.example.mycontentprovider.MyaContentProvider","lol/queryAll",PERSON_UPDATE_CODE); }
@Override
public boolean onCreate() {
//用数据库了,参数是上下文,用getContext()得到
BiaogeWudiOpenHelper myHelper = new BiaogeWudiOpenHelper(getContext());
db = myHelper.getReadableDatabase();
ContentValues values=new ContentValues();
values.put("hero", "项羽");
values.put("life", "5000");
values.put("type", "团控");
db.insert("lol", null, values);
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, //是传进来的uri
String[] projection,//想要查询的列名,是String数组类型
String selection,//查询的条件
String[] selectionArgs,//查询的条件的参数
String sortOrder) {//按照排序的参数
int match = matcher.match(uri);//匹配了下传进来的uri,
//如果匹配成功就是定义好的成功吗,如果匹配失败就是-1
//判读是否匹配成功
if (match==QUERYSUCCESS) {
Cursor cursor = db.query("lol",
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
return cursor;
}
else {
throw new IllegalArgumentException("叫你传没用数据,报错了把!!!");
}
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int match = matcher.match(uri);
if(match==PERSON_UPDATE_CODE){
int count=db.update("lol",values,selection,selectionArgs);
return count;
}
else {
throw new IllegalArgumentException("uri不匹配"+uri);
}
}
}
数据库:
public class BiaogeWudiOpenHelper extends SQLiteOpenHelper {
public BiaogeWudiOpenHelper(Context context) {
super(context, "biaogewudi.db", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"create table lol(id integer primary key autoincrement,hero varchar[20],life varchar[20],type varchar[20])");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
获取ContentProvider的程序
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button cha=(Button) findViewById(R.id.cha);
Button gai=(Button) findViewById(R.id.gai);
cha.setOnClickListener(this);
gai.setOnClickListener(this);
//得到内容解析者
contentResolver = getContentResolver();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.cha:
String str="content://com.example.mycontentprovider.MyaContentProvider/lol/queryAll";
Uri uri = Uri.parse(str);
Cursor cursor = contentResolver.query(uri,
null,
null,
null,
null);
while(cursor.moveToNext()){
String hero = cursor.getString(cursor.getColumnIndex("hero"));
String life = cursor.getString(cursor.getColumnIndex("life"));
String type = cursor.getString(cursor.getColumnIndex("type"));
System.out.println(hero+life+type+"hehehehehehe");
}
break;
case R.id.gai:
String strs="content://com.example.mycontentprovider.MyaContentProvider/lol/update";
Uri urii = Uri.parse(strs);
ContentValues contentValues = new ContentValues();
contentValues.put("hero", "项羽");
contentValues.put("life", "5000");
contentValues.put("type", "酱油");
contentResolver.update(urii, contentValues, "hero=?", new String[]{"项羽"});
break;
default:
break;
}
}
}