ContentProvider
四大组件的学习接近尾声了,不过还是不明白的一点是,官方对组件的划分是怎样进行的,是按照什么样的标准进行的。感觉组件还是一个比较模糊的概念。
1.内容提供器的概念
2.使用内容提供器
2.1数据插入 2.2获取数据 2.3数据更新 2.4数据删除
3.创建内容提供器
内容提供器概念
在Android系统中,由于每一个app都是在一个dalvik中,彼此之间互不影响,当然可以通过广播进行一些通讯,执行一些操作,但是如果要访问一些数据,执行一些数据的交互,则无法实现,有的时候,我们可能会用到其它应用的数据库中的一些数据,比如基于通讯录进行二次开发等,Android提供了ContentProvider和ContentResolver来进行应用间的数据访问。
使用内容提供器
Android提供了ContentResolver这个类,通过其我们可以实现对于一些开放了内容提供器的应用程序开发数据表的CRUD(create,retrieve,update,delete),ContentResolver提供了相应的方法,这些方法对应开发数据的ContentProvider的相应实现,但是这里对于数据的访问,不在像是对于sqlite中的数据访问,通过sql语句进行,而是通过统一资源定位符(uri)进行确定,其格式为权限+路径。
通过getResolver()得到一个ContentResolver的实例,然后通过这个实例中的delete(),updata(),query(),insert(),实现对于数据的操控,如何来找到其它应用程序开放的数据表呢?前面说到通过uri,权限和路径,权限用来区分我们不同的应用,路径用来表示我们应用内开放的表。这样我们就可以准确的定位到我们所要找的表了,当然还是需要遵循一个格式上的约定。
Uri uri = Uri.parse("content://com.example.testapp/table");
插入数据
public void insertData(){
Uri uri = Uri.parse("content://com.example.testapp/table");
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("key","value");
resolver.insert(uri,values);
}
查询数据
(可以通过制定相应的参数来获取更具体的数据)
public void getDataFromProviderContent(){
Uri uri = Uri.parse("content://com.example.testapp/table");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri,null,null,null,null);
if(cursor!=null){
while (cursor.moveToNext()){
String str = cursor.getString(1);
}
}
cursor.close();
}
数据删除
public void deleteDataFromProviderContent(){
Uri uri = Uri.parse("content://com.example.testapp/table");
ContentResolver resolver = getContentResolver();
resolver.delete(uri,"column=?",new String[]{"1"});
}
数据更新
public void updateDataFromProviderContent(){
Uri uri = Uri.parse("content://com.example.testapp/table");
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("key","value");
resolver.update(uri,values,"column=?",new String[]{"1"});
}
对于上述操作在对数据库进行操作的时候也是经常用到的,后面针对数据库将会研究下sqlite再更新一篇。这样,我们就可以解决了使用其他应用程序数据的问题。
(在我们使用系统提供的一些开放数据的时候,系统对于uri,会通过一些常量来进行替代)
创建内容提供器
上面讲的是关于我们如何使用其它的应用程序开放的数据,接下来是关于如何创建我们自己的内容提供器来将我们的应用程序中数据库的表提供给别人来使用。对于内容提供器,我们需要通过一个子类来继承ContentProvider,然后针对我们自己的应用重写其方法
public class MyContentProvider extends ContentProvider {
public MyContentProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return null;
}
}
综上,整个流程是,通过一个ContentProvider来对当前应用程序的数据库行为进行一个封装,选择性的将数据暴露出来,然后就可以通过统一资源定位符来进行找到,ContentResolver进行访问。