Android四大组件之一内容提供者
2016-03-13 21:28
906 查看
ContentProvider:内容提供者的作用就是把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用。
一. 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码。
二. 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址
三.创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作
四.uri携带数据,数据包括表名或者数字,字符串等。
a)添加匹配规则
b)通过Uri匹配器可以实现操作不同的表
c)如果路径中带有数字,把数字提取出来
代码实例
自定义内容提供者
访问自定义内容提供者
一. 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码。
public Uri insert(Uri uri, ContentValues values) { db.insert("person", null, values); return uri; }
二. 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址
<provider android:name="com.itheima.contentprovider.PersonProvider" android:authorities="com.itheima.person" android:exported="true" ></provider>
三.创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作
public void click(View v){ //得到内容分解器对象 ContentResolver cr = getContentResolver(); ContentValues cv = new ContentValues(); cv.put("name", "小方"); cv.put("phone", 138856); cv.put("money", 3000); //url:内容提供者的主机名 cr.insert(Uri.parse("content://com.itheima.person"), cv); }
四.uri携带数据,数据包括表名或者数字,字符串等。
a)添加匹配规则
//创建uri匹配对象 static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH); //检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配 static { um.addURI("com.example.people", "person", 1);//content://com.example.people/person um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3 }
b)通过Uri匹配器可以实现操作不同的表
public int delete(Uri uri, String selection, String[] selectionArgs) { int i; if(um.match(uri) == 1){ i = db.delete("person", selection, selectionArgs); }else if(um.match(uri) == 2){ i = db.delete("teacher", selection, selectionArgs); }else{ throw new IllegalArgumentException("uri有问题"); } return i; }
c)如果路径中带有数字,把数字提取出来
if(um.match(uri) == 3){ //把uri末尾携带的数字取出来 long id = ContentUris.parseId(uri); cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null); }
代码实例
自定义内容提供者
package com.example.provider;
import com.example.lzz.MyOpenHelper;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class PersonProvider extends ContentProvider {
private MyOpenHelper oh;
SQLiteDatabase db;
//创建uri匹配对象 static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH); //检查其他用户传入的uri与匹配器定义好的uri中,哪条匹配 static { um.addURI("com.example.people", "person", 1);//content://com.example.people/person um.addURI("com.example.people", "teacher", 2);//content://com.example.people/teacher um.addURI("com.example.people", "person/#", 3);//content://com.example.people/teacher/3 }
//内容提供者创建时调用
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor cursor = null;
if(um.match(uri) == 1){
cursor = db.query( "person", projection, selection, selectionArgs, null, null, sortOrder, null);
}else if(um.match(uri) == 2){
cursor = db.query( "teacher", projection, selection, selectionArgs, null, null, sortOrder, null);
}else if(um.match(uri) == 3){ //把uri末尾携带的数字取出来 long id = ContentUris.parseId(uri); cursor = db.query( "person", projection, "_id = ?", new String[]{id+""}, null, null, sortOrder, null); }
else{
throw new IllegalArgumentException("uri有问题");
}
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
//此方法供其他应用调用,用于往people数据库插入数据
//values由其他应用传入,用于封装要插入的数据
//uri:内容提供者的主机名也就是访问地址
@Override
public Uri insert(Uri uri, ContentValues values) {
//使用uri匹配器匹配传入的uri
if(um.match(uri) == 1){
db.insert("person", null, values);
}else if(um.match(uri) == 2){
db.insert("teacher", null, values);
}else{
throw new IllegalArgumentException("uri有问题");
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) { int i; if(um.match(uri) == 1){ i = db.delete("person", selection, selectionArgs); }else if(um.match(uri) == 2){ i = db.delete("teacher", selection, selectionArgs); }else{ throw new IllegalArgumentException("uri有问题"); } return i; }
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int i = db.update("person", values, selection, selectionArgs);
if(um.match(uri) == 1){
i = db.update("person", values, selection, selectionArgs);
}else if(um.match(uri) == 2){
i = db.update("teacher", values, selection, selectionArgs);
}else{
throw new IllegalArgumentException("uri有问题");
}
return i;
}
}
访问自定义内容提供者
package com.example.visitprovider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void insert(View v){ //通过内容提供者把数据插入people数据库 //拿到contentResolver ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put("name", "校长"); values.put("money", "13333"); //uri:内容提供者的主机名 //values要插入的数据 cr.insert(Uri.parse("content://com.example.people/teacher"), values); values.put("name", "张老师"); values.put("money", "33333"); cr.insert(Uri.parse("content://com.example.people/teacher"), values); values.put("name", "李老师"); values.put("money", "123456"); cr.insert(Uri.parse("content://com.example.peopleteacher/teacher"), values); } public void delete(View v){ ContentResolver cr = getContentResolver(); cr.delete(Uri.parse("content://com.example.people/person"), "name = ?", new String[]{"校长"}); } public void updata(View v){ ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put("name", "新张三"); int i = cr.update(Uri.parse("content://com.example.people/person"), values,"name = ?", new String[]{"张三"}); System.out.println(i); } public void select(View v){ ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(Uri.parse("content://com.example.people/person/4"), null, null, null, null); while(cursor.moveToNext()){ String name = cursor.getString(1); String money = cursor.getString(2); System.out.println("name:"+name+"money:"+money); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories