Android四大组件之ContentProvider详解–内容提供者
实际的开发中,一般也比较少开发自定义的内容提供者,一般都是使用
应用的数据库是不允许其他应用访问的
内容提供者的作用就是让别的应用访问到你的私有数据,就是一个java类
自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法
使用内容提供者可以自己定义访问规则,选择私有数据中哪些共享出去,哪些不共享
什么是Uri
URI,统一资源标识符
统一资源标识符用于标示一个抽象或者物理资源,也就是说URI是以一种抽象的,高层次概念定义统一资源标识
Android的Uri由以下三部分组成: “content://”、数据的路径、标示ID(可选)
比如content://com.aa.bb.cc/data什么是UriMatcher
UriMatcher 类主要用于匹配Uri,匹配Uri的路径- 如何使用
- ContentProvider类,提供内容访问
public class PersonProvider extends ContentProvider {//继承ContentProvider,重写里面的方法
private SQLiteDatabase db;
//内容提供者创建时调用
@Override
public boolean onCreate() {
MyOpenHelper oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
return false;
}
//values:其他应用要插的数据
@Override
public Uri insert(Uri uri, ContentValues values) {//插入
db.insert("person", null, values);//这里的values是调用者传进来的数据,因为我们内容提供者自己肯定不会去插数据的
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {//删除
int i = 0;
i = db.delete("person", selection, selectionArgs);
return i;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {//修改
int i = db.update("person", values, selection, selectionArgs);
return i;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {//查询
Cursor cursor = null;
cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);
return cursor;
}
}
- 在清单文件中注册
<provider android:name="com.example.contentprovider.PersonProvider"//包名.类名
android:authorities="com.example.person"//自定义的路径名
android:exported="true">//允许外部访问
</provider>
- 在另一个应用程序中
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void insert(View v){
//通过内容提供者把数据插入01数据库
//1.获取contentResolver
ContentResolver resolver = getContentResolver();
//2.访问内容提供者,插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("phone", 123456);
values.put("money", 10000);
//arg0:指定内容提供者的主机名
resolver.insert(Uri.parse("content://com.example.people"), values);
values.clear();
values.put("name", "李四");
values.put("phone", 12345);
//arg0:指定内容提供者的主机名
resolver.insert(Uri.parse("content://com.example.people"), values);
}
public void delete(View v){
ContentResolver resolver = getContentResolver();
int i = resolver.delete(Uri.parse("content://com.example.people"), "name = ?", new String[]{"张三"});
System.out.println(i);
}
public void update(View v){
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("money", 10001);
int i = resolver.update(Uri.parse("content://com.example.people"), values, "name = ?", new String[]{"张三"});
System.out.println(i);//更新的记录数
}
public void query(View v){
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(Uri.parse("content://com.example.people"), null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(1);
String phone = cursor.getString(2);
String money = cursor.getString(3);
System.out.println(name + ";" + phone + ";" + money);
}
}
}