6-19-1 Android应用程序组件:ContentProvider 待整理
2016-07-25 13:56
1776 查看
Android应用程序组件:ContentProvider ContentProvider:内容提供者,使用CP,可以在一个应用程序中给另一个应用程序 提供私有数据的访问,以达到数据共享的目的。 <1>创建一个ContentProvider: public class PersonContentProvider extends ContentProvider { //创建ContentProvider时调用 public boolean onCreate() { return false; } //其它程序通过ContentResolver接口调用query方法时被执行 //在此方法中提供数据查询的操作 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } //通过Uri获取该uri对应的数据类型 public String getType(Uri uri) { return null; } //其它程序通过ContentResolver接口调用insert方法时被执行 public Uri insert(Uri uri, ContentValues values) { return null; } //其它程序通过ContentResolver接口调用delete方法时被执行 public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } //其它程序通过ContentResolver接口调用update方法时被执行 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } } <2>在清单文件中注册ContentProvider: <provider android:authorities="com.moliying.provider.PersonProvider" android:name=".PersonContentProvider"/> authorities:主机名或访问权限(是提供为其它应用程序访问的地址) name:对应ContentProvider实现类 <3>在其它应用程序中访问这个ContentProvier: ContentResolver contentResolver = getContentResolver(); contentResolver.query(); contentResolver.insert(); contentResolver.delete(); contentResolver.update(); 以上方法来访问ContentProvider中的方法 并提供一个Uri来确定要访问哪个CP Uri的格式: content://com.moliying.provider.PersonProvider/路径/... content:// 访问CP的协议 com.moliying.provider.PersonProvider: 要访问的CP主机名 路径:具体在CP中定义的路径格式 实现一个CP,我们要定义好自己的访问路径,添加路径可以使用UriMather工具类: private static final String AUTHORITY = "com.moliying.provider.PersonProvider"; //用于匹配URI路径的匹配器 private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //Uri的匹配码 private static final int PERSON_CODE = 0X1; private static final int PERSON_SINGLE_CODE = 0X2; //自定义的数据类型 private static final String SINGLE_PERSON = "vnd.android.cursor.item/person"; private static final String MULTIPLE_PERSON = "vnd.android.cursor.dir/person"; static { //添加一个URI路径person,如果匹配成功,会返回一个编码:PERSON_CODE //可以匹配: content://com.moliying.provider.PersonProvider/person uriMatcher.addURI(AUTHORITY,"person",PERSON_CODE); //可以匹配: content://com.moliying.provider.PersonProvider/person/# #通配符只能匹配数字,*通配符可以匹配所有文本 uriMatcher.addURI(AUTHORITY,"person/#",PERSON_SINGLE_CODE); } 方法的具体实现: @Override public boolean onCreate() { dbHelper = new DatabaseAdapter.DatabaseHelper(getContext()); return true; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)){ case PERSON_CODE: SQLiteDatabase db = dbHelper.getReadableDatabase(); return db.query(DBMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder); case PERSON_SINGLE_CODE: long id = ContentUris.parseId(uri); selection = DBMetadata.Person._ID+"=?"; selectionArgs = new String[]{String.valueOf(id)}; db = dbHelper.getReadableDatabase(); return db.query(DBMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder); } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { switch (uriMatcher.match(uri)){ case PERSON_CODE: SQLiteDatabase db = dbHelper.getWritableDatabase(); long id = db.insertOrThrow(DBMetadata.Person.TABLE_NAME,null,values); uri = ContentUris.withAppendedId(uri,id); db.close(); return uri; } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)){ case PERSON_SINGLE_CODE: SQLiteDatabase db = dbHelper.getWritableDatabase(); long id = ContentUris.parseId(uri); selection = DBMetadata.Person._ID + "=?"; selectionArgs = new String[]{String.valueOf(id)}; int row = db.delete(DBMetadata.Person.TABLE_NAME,selection,selectionArgs); db.close(); return row; } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { switch (uriMatcher.match(uri)){ case PERSON_CODE: SQLiteDatabase db = dbHelper.getWritableDatabase(); int row = db.update(DBMetadata.Person.TABLE_NAME,values,selection,selectionArgs); db.close(); return row; case PERSON_SINGLE_CODE: db = dbHelper.getWritableDatabase(); long id = ContentUris.parseId(uri); selection = DBMetadata.Person._ID+"=?"; selectionArgs = new String[]{String.valueOf(id)}; row = db.update(DBMetadata.Person.TABLE_NAME,values,selection,selectionArgs); db.close(); return row; } return 0; } 在另一个程序的Activity中调用CP: public void addClick(View view){ ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person"); ContentValues values = new ContentValues(); values.put(DBMetadata.Person.NAME,"jack"); values.put(DBMetadata.Person.AGE,19); uri = cr.insert(uri,values); Toast.makeText(MainActivity.this, uri.toString(), Toast.LENGTH_SHORT).show(); } public void findByIdClick(View view){ ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1"); Cursor c = cr.query(uri,null,null,null,null); Person p = null; if (c.moveToFirst()){ p = new Person(c.getInt(0),c.getString(1),c.getInt(2)); } Toast.makeText(MainActivity.this, p.toString(), Toast.LENGTH_SHORT).show(); c.close(); } public void findAllClick(View view){ ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person"); Cursor c = cr.query(uri,null,null,null,null); ArrayList<Person> persons = new ArrayList<>(); Person p = null; while (c.moveToNext()){ p = new Person(c.getInt(0),c.getString(1),c.getInt(2)); persons.add(p); } Toast.makeText(MainActivity.this, persons.toString(), Toast.LENGTH_SHORT).show(); c.close(); } public void updateClick(View view){ ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1"); ContentValues values = new ContentValues(); values.put(DBMetadata.Person.NAME,"tom"); values.put(DBMetadata.Person.AGE,21); int row = cr.update(uri,values,null,null); Toast.makeText(MainActivity.this, "更新成功-"+row, Toast.LENGTH_SHORT).show(); } public void deleteClick(View view){ ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1"); int row = cr.delete(uri,null,null); Toast.makeText(MainActivity.this, "删除成功-"+row, Toast.LENGTH_SHORT).show(); }
相关文章推荐
- Android开发环境搭建
- android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
- Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》
- Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》
- android通过获取摄像头照片,实时与点传输
- Android API之CameraPreview
- Android 设置闹钟的解决方案
- ActionSheetForAndroid安卓版本的ActionSheet
- Android 自定义带有粘性的Scrollview
- Android内存和SD卡的数据存取
- Android Hello world程序再分析【Android程序的启动流程】
- Android优秀开源项目(分类 便于查看)
- android developer tiny share-20160725
- android developer tiny share-20160725
- Android基础总结(6)——内容提供器
- pull解析xml,可实现新闻解析、Android更新等
- Retrofit – Java(Android) 的REST 接口封装类库
- Android Studio中External Tools
- Android handle 多线程练习
- Android 拷贝assets目录下所有文件及文件夹到指定路径