2.作用:
应用的数据库是不允许其他应用访问的,内容提供者的作用就是让别的应用访问到你的数据库。
其是存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据(不同的进程中实现数据共享);
特点:
Android四大组件之一,需要在 清单文件AndroidManifest.xml中进行注册
注意事项:
Uri : 自定义的 内容提供者 其主机名 为内容提供者的主机名 authorities,其一般为内容提供者的包名;后面带的数据为表名称eg.”/people”。
Uri uri = Uri.parse(“content://com.example.android3_providecontent_demo2/people”);
系统定义的Uri:
MediaStore.Video.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的视频文件的内容的ContentProvider的URI
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的音频文件的内容的ContentProvider的URI
MediaStore.Images.Media.EXTERNAL_CONTENT_URI //存储在手机外部存储器上的图片文件的内容ContentProvider的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI //ContentProvider读取电话号码的Uri
ContactsContract.Contacts.CONTENT_URI //ContentProvider读取联系人的Uri
步骤:
5.1:在AndroidManifest.xml文件注册
//表示数据是否能导出
5.2 继承ContentProvider,实现增(insert)、删(delete)、改(update)、查(query)四个方法
5.3 在查询者的逻辑方法里,得到内容解析者(ContentResolver),通过指定要查询的程序的主机名和地址,可以调用到内容提供者的增(insert)、
删(delete)、改(update)、查(query)四个方法
深入5.2,进行 扩展 :内容提供者通常出现在要 提供数据的应用内
实现ContentProvider的(增删改查)四个方法;
增: insert(Uri uri, ContentValues values)
参数一:携带着解析者设置的主机名和地址
参数二:携带着解析者要插入的数据
删: delete(Uri uri, String selection, String[] selectionArgs)
参数一:携带着解析者设置的主机名和地址
参数二:删除数据的约束条件
参数三:删除数据的约束条件里,占位符(?)对应的数据
改: update(Uri uri, ContentValues values, String selection,String[] selectionArgs)
参数一:携带着解析者设置的主机名和地址
参数二:携带着解析者要修改的数据
参数三:修改数据的约束条件
参数四:修改数据的约束条件里,占位符(?)对应的数据
查: query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
参数一:携带着解析者设置的主机名和地址
参数二:要查询的列名
参数三:查询数据的约束条件
参数四:查询数据的约束条件里,占位符(?)对应的数据
参数五:排序
深入5.3,进行 扩展 :内容解析者通常出现在要 查询其他程序 的应用里
getContentResolver():得到内容解析者
增:contentResolver.insert(uri, values);
通过内容解析者操作内容提供者的insert方法
参数一:内容提供者的主机地址
参数二:要插入的数据
删: contentResolver.delete(url, where, selectionArgs)
通过内容解析者操作内容提供者的update方法
参数一:内容提供者的主机地址
参数二:删除数据的约束条件
参数三:约束条件占位符(?)的匹配数据
改: contentResolver.update(uri, values, where, selectionArgs)
通过内容解析者操作内容提供者的update方法
参数一:内容提供者的主机地址
参数二:要修改的数据
参数三:修改数据的约束条件
参数四:约束条件占位符(?)的匹配数据
查: contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
通过内容解析者操作内容提供者的query方法
参数一:内容提供者的主机地址
参数二:要查询的列名
参数三:查询的约束条件
参数四:约束条件占位符(?)的匹配数据
参数五:排序
示例代码:
建立内容提供者,供其他应用程序访问
一. 建立数据库
public class MyHelper extends SQLiteOpenHelper {
private static String NAME="provideCondent.db";
private String create_user="create table user(_id integer primary key autoincrement ,name text ,age text);";
private String create_people="create table people (_id integer primary key autoincrement ,pe_name text ,pe_age text);";
public MyHelper(Context context) {
super(context, NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(create_user);
db.execSQL(create_people);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
二. 创建内容提供者,实现 增删改查 的方法
public class MyContentProvider extends ContentProvider {
private static final int USER=1;
private static final int PEOPLE=2;
private SQLiteDatabase database;
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
//创建数据库对象
MyHelper myHelper = new MyHelper(getContext());
database = myHelper.getReadableDatabase();
// 获取匹配表格
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// uriMatcher.addURI(authority 主机名, path 表格, code 标示)
//匹配规则
{
uriMatcher.addURI("com.example.android3_providecontent_demo2", "user", USER);
uriMatcher.addURI("com.example.android3_providecontent_demo2", "people", PEOPLE);
}
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int match = uriMatcher.match(uri);
Cursor cursor=null;
switch (match) {
case USER:
cursor = database.query("user", projection, selection, selectionArgs, null, null, null);
break;
case PEOPLE:
cursor =database.query("people", projection, selection, selectionArgs, null, null, null);
break;
default:
break;
}
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int match = uriMatcher.match(uri);
switch (match) {
case USER:
database.insert("user", null, values);
break;
case PEOPLE:
database.insert("people", null, values);
break;
default:
break;
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int match = uriMatcher.match(uri);
switch (match) {
case USER:
database.delete("user", selection, selectionArgs);
break;
case PEOPLE:
database.delete("people", selection, selectionArgs);
break;
default:
break;
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int match = uriMatcher.match(uri);
switch (match) {
case USER:
database.update("user", values, selection, selectionArgs);
break;
case PEOPLE:
database.update("people", values, selection, selectionArgs);
break;
default:
break;
}
return 0;
}
}
三. 活动中创建数据库
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
MyHelper myHelper = new MyHelper(this);
myHelper.getReadableDatabase();
}
}
建立其他应用程序,访问内容解析者,操作提供内容提供者程序的数据库
其他应用程序,访问其他程序数据库,并对其他应用程序数据库进行操作。
public class MainActivity extends Activity {
private ListView main_listView;
private ArrayList list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList();
main_listView = (ListView) findViewById(R.id.main_listView);
}
public void insert(View v) {
// 获取内容解析者
ContentResolver resolver = getContentResolver();
// 插入数据 com.example.android3_providecontent_demo2
Uri uri = Uri
.parse("content://com.example.android3_providecontent_demo2/people");
ContentValues values = new ContentValues();
values.put("pe_name", "杨过");
values.put("pe_age", "20");
resolver.insert(uri, values);
}
public void query(View v){
list.clear();
//获取内容解析者
ContentResolver resolver = getContentResolver();
//查询数据
Uri uri=Uri.parse("content://com.example.android3_providecontent_demo2/people");
Cursor cursor = resolver.query(uri, new String[]{"_id","pe_name","pe_age"}, "pe_name=?", new String[]{"杨过"}, null);
//遍历
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex("pe_name"));
String age=cursor.getString(cursor.getColumnIndex("pe_age"));
String _id=cursor.getString(cursor.getColumnIndex("_id"));
System.out.println(_id+"--"+name+"---"+age);
list.add("id"+_id+"pe_name"+name+"pe_age"+age);
}
main_listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, list));
}
public void delete(View v) {
// 获取内容解析者
ContentResolver resolver = getContentResolver();
// 获取URI
Uri uri= Uri.parse("content://com.example.android3_providecontent_demo2/user");
resolver.delete(uri, "name=?", new String[] { "杨过" });
}
public void update(View v) {
// 获取内容解析者
ContentResolver resolver = getContentResolver();
// 获取URI
Uri uri=Uri.parse("content://com.example.android3_providecontent_demo2/user");
ContentValues values = new ContentValues();
values.put("name", "杨过");
values.put("age", "200");
resolver.update(uri, values, "name=?", new String[] { "杨过" });
}
}