四大应用组件之ContentProvider【Android】
2016-09-13 08:47
323 查看
一、概述
ContentProvider是四大应用组件之一
当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问
其它应用需要使用ContentResolver来调用ContentProvider的方法
它们之间的调用是通过Uri来进行交流的
二、相关API
1.内容提供者类
2.ContentResolver: 内容提供者的解析类
A : 是一个前缀,表示是由ContentProvider提供,固定不变
B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
C : 对应于哪张表 student
D : id值, 对应表中的哪条记录
4.UriMatcher : 用于匹配Uri的容器
5.ContentUris : 解析uri的工具类
1.编写ContentProvider子类
ContentProvider是四大应用组件之一
当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问
其它应用需要使用ContentResolver来调用ContentProvider的方法
它们之间的调用是通过Uri来进行交流的
二、相关API
1.内容提供者类
//provider对象创建后调用(应用安装成功或手机启动完成) public abstract boolean onCreate(); //查询表数据 Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs) //插入表数据 Uri insert(Uri uri, ContentValues values); //删除表数据 int delete(Uri uri, String selection, String[] selectionArgs) //更新表数据 update(Uri uri, ContentValues values, String selection,String[] selectionArgs);
2.ContentResolver: 内容提供者的解析类
//得到它的对象 context.getContentResolver() //调用provider进行数据库CRUD操作 Insert()、delete()、update()、query() //注册uri的监听 registerContentObserver(Uri uri, boolean notify,ContentObserver observer) //解注册uri的监听 unregisterContentObserver(ContentObserver observer) //通知监听器 notifyChange(Uri uri, ContentObserver observer)3.Uri: 包含请求地址数据的类
//得到其对象 Uri static parse(String uriString)
A : 是一个前缀,表示是由ContentProvider提供,固定不变
B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
C : 对应于哪张表 student
D : id值, 对应表中的哪条记录
4.UriMatcher : 用于匹配Uri的容器
//添加一个合法的URI void addURI(String authority, String path, int code) //匹配指定的uri, 返回匹配码 int match(Uri uri)
5.ContentUris : 解析uri的工具类
//解析uri, 得到其中的id long parseId(Uri contentUri) //添加id到指定的uri中 Uri withAppendedId(Uri contentUri, long id)三、代码实现
1.编写ContentProvider子类
package com.example.provider; 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; import android.util.Log; /** * 操作person表的provider类 * * @author Xiaocici * */ public class PersonProvider extends ContentProvider { // 用来存放所有合法的Uri的容器 private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // 保存一些合法的uri // content://com.example.provider.personprovider/person 不根据id操作 // content://com.example.provider.personprovider/person/3 根据id操作 static { matcher.addURI("com.example.provider.personprovider", "/person", 1); matcher.addURI("com.example.provider.personprovider", "/person/#", 2);// #匹配任意数字 } private DBHelper dbHelper; public PersonProvider() { Log.e("TAG", "PersonProvider()"); } @Override public boolean onCreate() { Log.e("TAG", "onCreate()"); dbHelper = new DBHelper(getContext()); return false; } /** * content://com.example.provider.personprovider/person 不根据id查询 * content://com.example.provider.personprovider/person/3 根据id查询 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Log.e("TAG", "query()"); // 得到连接对象 SQLiteDatabase database = dbHelper.getReadableDatabase(); // 1.匹配uri,返回code int code = matcher.match(uri); // 如果合法,进行查询 if (code == 1) {// 不根据id查询 Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null); return cursor; } else if (code == 2) {// 根据id查询 // 得到id long id = ContentUris.parseId(uri); // 查询 Cursor cursor = database.query("person", projection, "_id=?", new String[] { id + "" }, null, null, null); return cursor; } else {// 如果不合法,抛出异常 throw new RuntimeException("查询的uri不合法"); } } @Override public String getType(Uri uri) { Log.e("TAG", "getType()"); return null; } /** * content://com.example.provider.personprovider/person 插入 */ @Override public Uri insert(Uri uri, ContentValues values) { Log.e("TAG", "insert()"); // 得到连接对象 SQLiteDatabase database = dbHelper.getReadableDatabase(); // 匹配uri,返回code int code = matcher.match(uri); // 如果合法,进行插入 if (code == 1) { long id = database.insert("person", null, values); //将id添加到uri中 uri = ContentUris.withAppendedId(uri, id); database.close(); return uri; } else {// 如果不合法,抛出异常 database.close(); throw new RuntimeException("插入的uri不合法"); } } /** * content://com.example.provider.personprovider/person 不根据id删除 * content://com.example.provider.personprovider/person/3 根据id删除 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Log.e("TAG", "delete()"); // 得到连接对象 SQLiteDatabase database = dbHelper.getReadableDatabase(); // 匹配uri,返回code int code = matcher.match(uri); int deleteCount = -1; // 如果合法,进行删除 if (code == 1) { deleteCount = database.delete("person", selection, selectionArgs); }else if(code ==2){ long id = ContentUris.parseId(uri); deleteCount = database.delete("person", "_id="+id, null); }else{// 如果不合法,抛出异常 database.close(); throw new RuntimeException("删除的uri不合法"); } database.close(); return deleteCount; } /** * content://com.example.provider.personprovider/person 不根据id更新 * content://com.example.provider.personprovider/person/3 根据id更新 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Log.e("TAG", "update()"); // 得到连接对象 SQLiteDatabase database = dbHelper.getReadableDatabase(); // 匹配uri,返回code int code = matcher.match(uri); int updateCount = -1; // 如果合法,进行更新 if (code == 1) { updateCount = database.update("person", values, selection, selectionArgs); }else if(code ==2){ long id = ContentUris.parseId(uri); updateCount = database.update("person", values, "_id="+id, null); }else{// 如果不合法,抛出异常 database.close(); throw new RuntimeException("更新的uri不合法"); } database.close(); return updateCount; } }2.在manifest.xml中注册
<span style="white-space:pre"> </span><provider android:name="com.example.provider.PersonProvider" android:exported="true" android:authorities="com.example.provider.personprovider"/> <!-- exported :是否可以让其它应用访问 -->3.得到其对象
ContentResolver resolver = getContentResolver();4.使用其对象
inert()、delete()、update()和query() 系统自动找到匹配的ContentProvider对象来操作数据 registerContentObserver(Uri uri, boolean notify,ContentObserver observer) 注册uri的监听 unregisterContentObserver(ContentObserver observer) 解注册uri的监听 notifyChange(Uri uri, ContentObserver observer) 通知监听器
package com.example.resolver; 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.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /* * 通过ContentResolver调用ContentProvider插入一条记录 */ public void insert(View v){ //1.得到ContentResolver对象 ContentResolver resolver = getContentResolver(); //2.调用其insert Uri uri = Uri.parse("content://com.example.provider.personprovider/person/"); ContentValues values = new ContentValues(); values.put("name", "Jack"); Uri insert = resolver.insert(uri, values); Toast.makeText(this,insert.toString(), 1).show(); } /* * 通过ContentResolver调用ContentProvider更新一条记录 */ public void update(View v){ //1.得到ContentResolver对象 ContentResolver resolver = getContentResolver(); //2.执行update Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2"); ContentValues values = new ContentValues(); values.put("name", "Jack2"); int updateCount = resolver.update(uri, values, null, null); Toast.makeText(this,"updateCount="+updateCount, 1).show(); } /* * 通过ContentResolver调用ContentProvider删除一条记录 */ public void delete(View v){ //1.得到ContentResolver对象 ContentResolver resolver = getContentResolver(); //2.执行delete Uri uri = Uri.parse("content://com.example.provider.personprovider/person/2"); int deleteCount = resolver.delete(uri, null, null); Toast.makeText(this,"deleteCount="+deleteCount, 1).show(); } /* * 通过ContentResolver调用ContentProvider查询所有记录 */ public void query(View v){ //1.得到ContentResolver对象 ContentResolver resolver = getContentResolver(); //2.调用其query,得到cursor Uri uri = Uri.parse("content://com.example.provider.personprovider/person/"); Cursor cursor = resolver.query(uri, null, null, null, null); //3.取出cursor中的数据,并显示 while(cursor.moveToNext()){ int id = cursor.getInt(0); String name = cursor.getString(1); Toast.makeText(this, id+":"+name, 0).show(); } cursor.close(); } }5.数据库操作
package com.example.provider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { super(context, "atschool.db", null, 1); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { Log.e("TAG", "onCreate()"); //建表 db.execSQL("create table person(_id integer primary key autoincrement,name varchar)"); //插入初始化数据 db.execSQL("insert into person (name) values ('TOM')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
相关文章推荐
- Android四大组件之ContentProvider实现多应用之间传递数据实例
- Android四大组件应用系列——使用ContentProvider实现跨进程通讯
- Android核心技术之(9)---四大应用组件之ContentProvider
- Android 四大应用组件之ContentProvider
- 【Android基础入门〖6〗】四大组件之ContentProvider
- android 四大重要的组件之ContentProvider
- android 四大组件之ContentProvider
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
- android四大组件--ContentProvider具体解释
- Android应用基础及原理概要,四大组件
- 四,android四大组件基础介绍及打电话,发短信简单应用 &单元测试
- 01 Android应用的构成 四大组件 Activity, Intent Receiver , Service , Content Provider
- Android四大应用构件之ContentProvider解析
- Android 四大组件之一 ContentProvider
- Android学习日志13__四大组件04__ContentProvider
- Android四大组件之一之内容提供者ContentProvider
- android四大组件之ContentProvider
- Android四大组件之一ContentProvider(内容提供者)
- 【Android基础入门〖6〗】四大组件之ContentProvider
- Android的四大组件之ContentProvider总结