一、什么是内容提供者?
ContentProvider(内容提供者)是Android中的四大组件之一。ContentProvider为不同的软件之间数据共享,提供统一的接口。
ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数
据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。ContentProvider定义一
个对外开放的接口,从而使得其他的应用可以使用我们自己应用中的文件、数据库内存储的信息。实际开发过程中并不是很常用,
android系统中的信息,图片库,联系人常用到,但谷歌工程师已经帮我封装好了,我们只需要访问即可。
二、为什么会有内容提供者?
内容提供者向其它的应用程序提供了一个数据访问的方式,这种方式相对于文件存储共享和sharedpreferences共享数据而言
的话,它提供了一个统一的数据访问方式,更方便更有效。
三、如何创建一个内容提供者?
首先:写一个类继承Contentprovider,重写六个方法如下实例所示
其次:在AndroidManifest.xml的节点下配置指定name和authorities属性
实例:
package com.sun.administrator.sqlite;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.zking.db.DBHelper;
/**
* Created by Administrator on 2017/7/17 0017.
*/
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
Log.i("test","onCreate");
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Log.i("test","query");
//把数据查询出来
DBHelper dbHelper=new DBHelper(getContext(),"test.db",null,1);
SQLiteDatabase sqLiteDatabase=dbHelper.getReadableDatabase();
//sqLiteDatabase.rawQuery("select * from login",null);
return sqLiteDatabase.rawQuery("select * from login",null);
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.i("test","insert");
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.i("test","delete");
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.i("test","update");
return 0;
}
}
配置信息:`
package com.sun.administrator.contentresolver;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取上面一个应用程序的数据
//获取内容访问者
ContentResolver cr=getContentResolver();
Uri uri=Uri.parse("content://com.sun.administrator.sqlite.LOGIN");
Cursor cursor=cr.query(uri,null,null,null,null);
while(cursor.moveToNext()){
int uid=cursor.getInt(cursor.getColumnIndex("uid"));
String uname=cursor.getString(cursor.getColumnIndex("uname")) ;
String upass=cursor.getString(cursor.getColumnIndex("upass")) ;
Log.i("test",uid+" "+uname+" "+upass);
}
}
}
小结: ① ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法
② ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据
③ ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略
④ ContentProvider中可以注册观察者, 监听数据的变化
注意:1、配置信息中name 是完整的类名
2、authorities是访问Provider时的路径,一定要唯一