Android(安卓)组件 ContentProvider 内容提供者
16lz
2022-01-11
什么是内容提供者:内容提供者是Android中的四大组件之一,可以将应用程序中的数据对外共享,我们创建一个内容提供者,通过通用的接口将数据共享。
首先要继承类 ContentProvider 对父类的方法进行重新实现
package com.example.contentprovider;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;public class MyContentProvider extends ContentProvider {// 自己实现的数据库操作帮助类private MyOpenHelper myOpenHelper; // 数据库相关类 private SQLiteDatabase sqLiteDatabase; // uri匹配相关private static UriMatcher uriMatcher;// 主机名称(这一部分是可以随便取得)private static final String authority = "com.example.contentprovider"; // 数据表名 private final String Table_Name = "Content"; // 注册该内容提供者匹配的uristatic {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);/* * path_chenzheng部分的字符串是随便取得,1代表着如果请求的uri与当前加入 * 的匹配uri正好吻合,uriMathcher.match()方法返回的值.#代表任意数字,*代表任意字符串 */uriMatcher.addURI(authority, "add", 1);// 代表当前表中的所有的记录uriMatcher.addURI(authority, "add/#", 2);// 代表当前表中的某条特定的记录}// 数据表中的列名映射private static final String _id = "id";private static final String name = "name";private static final String age = "age";private static final String isMan = "isMan"; // 版本号 private final int Version_1 = 1;@Overridepublic boolean onCreate() {try {myOpenHelper = new MyOpenHelper(getContext(), "TestDB", null,Version_1);} catch (Exception e) {return false;}return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {sqLiteDatabase = myOpenHelper.getWritableDatabase();Cursor c = sqLiteDatabase.query(Table_Name, new String[]{"id","name","age"}, null, null, null, null, null);return c;}/** * @description 获取当前内容提供者的MIME类型 集合类型必须添加前缀vnd.android.cursor.dir/(该部分随意) * 单条记录类型添加前缀vnd,android.cursor.item/(该部分随意) * 定义了该方法之后,系统会在第一次请求时进行验证,验证通过则执行crub方法时不再重复进行验证, * 否则如果没有定义该方法或者验证失败,crub方法执行的时候系统会默认的为其添加类型验证代码。 */@Overridepublic String getType(Uri uri) {int code = uriMatcher.match(uri);switch (code) {case 1:return "vnd.android.cursor.dir/chenzheng_java";case 2:return "vnd.android.cursor.item/chenzheng_java";default:throw new IllegalArgumentException("异常参数");}}@Overridepublic Uri insert(Uri uri, ContentValues values) {sqLiteDatabase = myOpenHelper.getWritableDatabase();int code = uriMatcher.match(uri);switch (code) {case 1:sqLiteDatabase.insert(Table_Name, name, values); break;default:throw new IllegalArgumentException("异常参数");}return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int num = 0; sqLiteDatabase = myOpenHelper.getWritableDatabase();int code = uriMatcher.match(uri); switch (code) {case 1:num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs); break;case 2: long id = ContentUris.parseId(uri); selection = (selection == null || "".equals(selection.trim())) ? _id + "=" + id : selection + " and " + _id + "=" + id; num = sqLiteDatabase.update(Table_Name, values, selection, selectionArgs); break;default:throw new IllegalArgumentException("异常参数");}return num;}}
内容提供者使用Uri来操作数据,Uri包含了两部分:① 需要操作的内容提供者,② 要操作的数据
Activity 代码
package com.example.contentprovider;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.util.Log;import android.view.View;import android.widget.TextView;public class ContentProviderActivity extends Activity {ContentResolver reslover;Uri uri;String result = "结果:/n";private final static String tag = "通知"; private TextView textView; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);textView = (TextView) findViewById(R.id.textView);uri = Uri.parse("content://com.example.contentprovider/add"); reslover = getContentResolver();}public void insertContent(View view){insert(reslover,uri);}public void updateContent(View view){update(reslover,uri);}public void queryContent(View view) {Cursor cursor = query(reslover, uri);while(cursor.moveToNext()){System.out.println(cursor.getInt(cursor.getColumnIndex("id")));System.out.println(cursor.getString(cursor.getColumnIndex("name")));System.out.println(cursor.getString(cursor.getColumnIndex("age")));}}private Cursor query(ContentResolver resolver, Uri uri){Cursor cursor = resolver.query(uri, null, null, null, null);return cursor;}private void update(ContentResolver resolver, Uri uri){ ContentValues contentValues = new ContentValues(); contentValues.put("age", 122); int number = resolver.update(uri, contentValues, null, null); Log.i(tag, "更新成功!"); result += "成功更新了" + number+"条记录"; textView.setText(result); result = ""; } private void insert(ContentResolver resolver, Uri uri) { ContentValues contentValues = new ContentValues(); contentValues.put("id", 1); contentValues.put("name", "张大凡"); contentValues.put("age", 30); contentValues.put("isMan", true); Uri uri2 = resolver.insert(uri, contentValues); Log.i(tag, "插入成功!"); result += "成功插入了一条记录,uri为" + uri2; textView.setText(result); result = ""; } }
更多相关文章
- RK3288 Android(安卓)7.1 调试 USB MIDI
- Android监听Home、电源键
- Android动态设置Margin的方法
- Android(安卓)8.0 Activity启动过程分析
- 【Android】进程间通信IPC——Binder
- 详解 Android(安卓)的 Activity 组件
- Android(安卓)Studio调错误方法
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用