ContentProvider
来源:互联网 发布:pc蛋蛋计算器单双算法 编辑:程序博客网 时间:2024/06/09 16:06
1 ContentProvider介绍
ContentProvider:为存储和获取数据提供了统一的接口;
使用ContentProvider可以在不同应用程序之间共享数据,是应用程序间共享数据的唯一方法;
在Android中没有一块公共的,所有应用程序都能访问的数据存储的地方;
android为常见的一些数据提供了ContentProvider(包括音视频,图片,通讯录等等);
ContentProvider使用表的形式来组织数据:
每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据;
所有的ContentProvider的URI都以字符串“content://”开始:【content://com.example.transportationprovider/trans/122】的四个部分
Android所提供的ContentProvider都存放在androi.provider包当中
2 ContentProvider所提供的方法
3 实现ContentProvider的过程
前提是,存在一个用于存放数据的系统
① 定义一个继承自ContentProvider的类
②声明一个Uri类型的常量CONTENT_URI
③实现query()、 insert()、 update()、 delete()、 getType()、 onCreate()
④在AndroidManifest.xml文件中进行声明
3.1 定义一个CONTENT_URI常量
public static final String AUTHORIY = "com.example.handler.FirstContentProvider";// 访问ContentProvider的URIpublic static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORIY+"/users");
3.2 定义一个类,继承ContentProvider
实现query、insert、onCreate等方法
public class FirstContentProvider extends ContentProvider {// 操作URI的类public static final UriMatcher uriMatcher;// 访问所有的列public static final int INCOMING_USER_COLLECTION = 1;// 访问单独的列public static final int INCOMING_USER_SINGLE = 2;private DatabaseHelper dh;// 为UriMatcher添加自定义的URIstatic {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users",INCOMING_USER_COLLECTION);uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users/#",INCOMING_USER_SINGLE);}// 为数据库表字段起别名public static HashMap<String, String> userProjectionMap;static {userProjectionMap = new HashMap<String, String>();userProjectionMap.put(UserTableMetaData._ID, UserTableMetaData._ID);userProjectionMap.put(UserTableMetaData.USER_NAME,UserTableMetaData.USER_NAME);}@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {// TODO Auto-generated method stubSystem.out.println("delete");return 0;}// 根据传入的URI,返回URI所表示的数据类型@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubSystem.out.println("getType");switch (uriMatcher.match(uri)) {case INCOMING_USER_COLLECTION:return UserTableMetaData.CONTENT_TYPE;case INCOMING_USER_SINGLE:return UserTableMetaData.CONTENT_TYPE_ITEM;default:throw new IllegalArgumentException("Unknown URI " + uri);}}// 该函数的返回值是一个URI,这个URi表示的是刚刚所插入的数据@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSystem.out.println("insert");SQLiteDatabase db = dh.getWritableDatabase();long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);if (rowId > 0) {Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);// 通知监听器,数据已经改变getContext().getContentResolver().notifyChange(insertedUserUri,null);return insertedUserUri;}throw new SQLException("Failed to insert row into " + uri);}// 是一个回调方法,在ContentProvider创建时调用@Overridepublic boolean onCreate() {// TODO Auto-generated method stubSystem.out.println("onCreate");// 打开数据库dh = new DatabaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME);return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSystem.out.println("query");SQLiteQueryBuilder qb = new SQLiteQueryBuilder();switch (uriMatcher.match(uri)) {case INCOMING_USER_COLLECTION:qb.setTables(UserTableMetaData.TABLE_NAME);qb.setProjectionMap(userProjectionMap);break;case INCOMING_USER_SINGLE:qb.setTables(UserTableMetaData.TABLE_NAME);qb.setProjectionMap(userProjectionMap);// 追加条件,getPathSegments()得到用户请求的Uri地址截取的数组;get(1)得到去掉地址中/以后的第二个元素qb.appendWhere(UserTableMetaData._ID + "="+ uri.getPathSegments().get(1));default:break;}String orderBy;if (TextUtils.isEmpty(sortOrder)) {orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;} else {orderBy = sortOrder;}SQLiteDatabase db = dh.getWritableDatabase();Cursor c = qb.query(db, projection, selection, selectionArgs, null,null, orderBy);c.setNotificationUri(getContext().getContentResolver(), uri);return c;}@Overridepublic int update(Uri uri, ContentValues values, String arg2, String[] arg3) {// TODO Auto-generated method stubSystem.out.println("update");return 0;}}
为ContentProvider提供一个常量类(Uri也可以定义在这里):
public class FirstProviderMetaData {public static final String AUTHORIY = "com.example.handler.FirstContentProvider";// 数据库名称public static final String DATABASE_NAME = "FirstProvider.db";// 数据库版本public static final int DATABASE_VERSION = 1;// 表名public static final String USERS_TABLE_NAME = "users";public static final class UserTableMetaData implements BaseColumns {// 表名public static final String TABLE_NAME = "users";// 访问ContentProvider的URIpublic static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORIY+"/users");// 该ContentProvider所返回的数据类型定义public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";// 列名public static final String USER_NAME = "name";// 默认排序方式public static final String DEFAULT_SORT_ORDER = "_id desc";}}
为ContentProvider提供一个数据库访问类:
public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;// 当前对象,表名, , 版本public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context, String name, int version) {this(context, name, null, version);}public DatabaseHelper(Context context, String name) {this(context, name, VERSION);}// 第一次创建数据库的时候调用@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a database");db.execSQL("create table "+FirstProviderMetaData.USERS_TABLE_NAME+"( " + FirstProviderMetaData.UserTableMetaData._ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"+ FirstProviderMetaData.UserTableMetaData.USER_NAME +" varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a database");}}
3.3 在AndroidManifest.xml中进行配置
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.handler.SQLiteActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="com.example.handler.FirstContentProvider" android:authorities="com.example.handler.FirstContentProvider" /> <!-- 在这里配置 --> </application>
4 使用ContentProvider
MainActivity.java:
public class MainActivity extends Activity {private static final int ONE = 1;private static final int TWO = 2;private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnAdd1).setOnClickListener(listener);findViewById(R.id.btnAdd2).setOnClickListener(listener);findViewById(R.id.btnupdate1).setOnClickListener(listener);findViewById(R.id.btnupdate2).setOnClickListener(listener);findViewById(R.id.btnQuery1).setOnClickListener(listener);findViewById(R.id.btnQuery2).setOnClickListener(listener);findViewById(R.id.btnDel1).setOnClickListener(listener);findViewById(R.id.btnDel2).setOnClickListener(listener);}private OnClickListener listener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnAdd1:add(ONE);break;case R.id.btnAdd2:add(TWO);break;case R.id.btnupdate1:update(ONE);break;case R.id.btnupdate2:update(TWO);break;case R.id.btnQuery1:query(ONE);break;case R.id.btnQuery2:query(TWO);break;case R.id.btnDel1:delete(ONE);break;case R.id.btnDel2:delete(TWO);break;default:break;}}};protected void add(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;ContentValues values = new ContentValues();switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");values.put("name", "libai");values.put("age", "100");Log.i(TAG, contentResolver.insert(uri, values).toString());break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/1");values.put("name", "dufu");values.put("age", "101");Log.i(TAG, contentResolver.insert(uri, values).toString());break;default:break;}}protected void update(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;ContentValues values = new ContentValues();String where = "";String[] selectionArgs = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");values.put("name", "updated");values.put("age", "23");where = "sid = ?";selectionArgs = new String[]{"1"};contentResolver.update(uri, values, where, selectionArgs);break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/2");values.put("name", "Updated");values.put("age", "23");where = null;selectionArgs = null;contentResolver.update(uri, values, where, selectionArgs);break;default:break;}}protected void query(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;String[] projection = new String[]{"sid", "name", "age"};String selection = "";String[] selectionArgs = null;String sortOrder = "";Cursor cursor = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");selection = "sid < ?";selectionArgs = new String[]{"3"};cursor=contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);while(cursor.moveToNext()) {Log.i(TAG, "sid="+cursor.getInt(0)+"; name="+cursor.getString(1)+"; age="+cursor.getInt(2));}break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/1");cursor=contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);while(cursor.moveToNext()) {Log.i(TAG, "sid="+cursor.getInt(0)+"; name="+cursor.getString(1)+"; age="+cursor.getInt(2));}break;default:break;}}protected void delete(int type) {ContentResolver contentResolver = getContentResolver();Uri uri = null;String where = "";String[] selectionArgs = null;switch (type) {case ONE:uri = Uri.parse("content://com.example.contentprovider/student");where = "sid in(?, ?)";selectionArgs = new String[]{"1", "2"};contentResolver.delete(uri, where, selectionArgs);break;case TWO:uri = Uri.parse("content://com.example.contentprovider/student/2");where = null;selectionArgs = null;contentResolver.delete(uri, where, selectionArgs);break;default:break;}}}
阅读全文
0 0
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentprovider
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentprovider
- contentprovider
- ContentProvider
- ContentProvider
- nginx docker 镜像(带lua的1.11.2 与 1.12.0)
- 【 软考之再总结】
- USACO->Your Ride Is Here
- 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)
- 谷歌的小弟自定义View篇笔记(杂)
- ContentProvider
- USB键盘协议程序之字符重复无数次
- hihoCoder 1524 : 逆序对 (树状数组)
- 实际工作中:----dubbo+zookeeper实现服务远程调用
- Quartz执行多作业,JobDataMap传值
- C语言--变量
- QQ聊天消息展示,提交评论实现
- 常用的dos命令介绍
- VCS-5续2 LVM和VxVM