Android四大组件之内容提供者--ContentProvider
来源:互联网 发布:pp助手 安装mac软件 编辑:程序博客网 时间:2024/04/29 17:03
ContetProvider:一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据
1、ContentProvider是用表的形式来组织数据
2、ContentProvider提供的方法
query:查询
insert:插入
update:修改
delete:删除
getType:获取到数据类型
onCreate:创建数据时调用的回调函数
3、ContentProvider有一个URI匹配器,这个URI用于表示这个ContentProvider所提供的数据
实现步骤:
1、定义一个类,继承ContentProvider
2、在manifests文件下的AndroidManifest中注册
3、实例化一个UriMatcher
4、创建一个静态(static)块添加uri
5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
代码实现如下:
项目名:ContentProvider_Dome_one
1、定义一个类,继承ContentProvider
public class MyContentProvider extends ContentProvider { public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); MySql mySql; SQLiteDatabase sqLiteDatabase; static {/** *参数一:String authority: 填写注册的authority *参数二String path: 方法的标记 *参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配 * uri由voi.name/query组成 */ uriMatcher.addURI("voi.name", "query", 0); uriMatcher.addURI("voi.name", "insert", 1); uriMatcher.addURI("voi.name", " delete",2); uriMatcher.addURI("voi.name", " update",3); } @Override public boolean onCreate() { mySql = new MySql(getContext()); sqLiteDatabase = mySql.getWritableDatabase(); return false; } /** * @param uri 方法匹配的uri * @param projection 列名 * @param selection 查询条件 * @param selectionArgs 查询条件的值 * @param sortOrder 排序 * @return */ @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { if (uriMatcher.match(uri) == 0) {//匹配成功 /** * String table 表名 * String[] selection 列名 * String selection 查询条件 * String[] selectionArgs 查询条件的值 * String groupBy 分组 * String having 拥有条件 * String orderBy 排序 */ Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder); return cursor;//返回数据集 } else { //失败 return null; } } @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { if (uriMatcher.match(uri) == 1) { /**insert返回值 当前插入的行数*/ sqLiteDatabase.insert("user", null, values); Uri uri1=Uri.parse("voi.name/insert"); return uri1; } else { return null; } } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { if(uriMatcher.match(uri)==2){ /**delete返回值 表示被影响(删除)的行数*/ int code= sqLiteDatabase.delete("user",selection,selectionArgs); return code; }else{ return -1; } } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { if(uriMatcher.match(uri)==3){ /**update 表示被影响(修改)的行数*/ int code= sqLiteDatabase.update("user",values,selection,selectionArgs); return code; }else{ return -1; } }}2、在manifests文件下的AndroidManifest中注册
<provider android:authorities="voi.name" android:name=".provider.MyContentProvider" android:exported="true"/>
Authorities 名称随便取,但是自己要记住
Name:和Activity一样,是自定义ContentProvider的路径和名字
Exported 是否暴露数据,写true
3、实例化一个UriMatcher
public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
4、创建一个静态(static)块添加uri
static {/** *参数一:String authority: 填写注册的authority *参数二String path: 方法的标记 *参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配 * uri由voi.name/query组成 */ uriMatcher.addURI("voi.name", "query", 0); uriMatcher.addURI("voi.name", "insert", 1); uriMatcher.addURI("voi.name", " delete",2); uriMatcher.addURI("voi.name", " update",3); }5、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
public class MyContentProvider extends ContentProvider { public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); MySql mySql; SQLiteDatabase sqLiteDatabase; static {/** *参数一:String authority: 填写注册的authority *参数二String path: 方法的标记 *参数三 int code: 两方匹配后的返回值 除了-1 因为-1是不匹配 * uri由voi.name/query组成 */ uriMatcher.addURI("voi.name", "query", 0); uriMatcher.addURI("voi.name", "insert", 1); uriMatcher.addURI("voi.name", " delete",2); uriMatcher.addURI("voi.name", " update",3); } @Override public boolean onCreate() { mySql = new MySql(getContext()); sqLiteDatabase = mySql.getWritableDatabase(); return false; } /** * @param uri 方法匹配的uri * @param projection 列名 * @param selection 查询条件 * @param selectionArgs 查询条件的值 * @param sortOrder 排序 * @return */ @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { if (uriMatcher.match(uri) == 0) {//匹配成功 /** * String table 表名 * String[] selection 列名 * String selection 查询条件 * String[] selectionArgs 查询条件的值 * String groupBy 分组 * String having 拥有条件 * String orderBy 排序 */ Cursor cursor = sqLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder); return cursor;//返回数据集 } else { //失败 return null; } } @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { if (uriMatcher.match(uri) == 1) { /**insert返回值 当前插入的行数*/ sqLiteDatabase.insert("user", null, values); Uri uri1=Uri.parse("voi.name/insert"); return uri1; } else { return null; } } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { if(uriMatcher.match(uri)==2){ /**delete返回值 表示被影响(删除)的行数*/ int code= sqLiteDatabase.delete("user",selection,selectionArgs); return code; }else{ return -1; } } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { if(uriMatcher.match(uri)==3){ /**update 表示被影响(修改)的行数*/ int code= sqLiteDatabase.update("user",values,selection,selectionArgs); return code; }else{ return -1; } }}由于在这里的ContentProvider,我使用了数据库,所以数据库的代码如下:
public class MySql extends SQLiteOpenHelper { public static String NAME="user"; public static int VERSION=1; public MySql(Context context) { super(context, NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user(_id integer primary key autoincrement ,name varchar(20),age int)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}MainActivity中的代码:
这里我在数据库中增加了数据
public class MainActivity extends AppCompatActivity { SQLiteDatabase sqLiteDatabase; MySql mysql; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mysql = new MySql(this); sqLiteDatabase = mysql.getWritableDatabase(); init(); } private void init() { ContentValues cv = new ContentValues(); String name = "a"; int age = 20; cv.put("name", name); cv.put("age", age); sqLiteDatabase.insert("user", null, cv); /** * String table 表名 * String[] selection 列名 * String selection 查询条件 * String[] selectionArgs 查询条件的值 * String groupBy 分组 * String having 拥有条件 * String orderBy 排序 */ Cursor cursor = sqLiteDatabase.query("user", null, null, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String names = cursor.getString(0); int ages=cursor.getInt(1); Log.i("a",names+""+ages); } } }}P:如果另一个程序觉得上面这个程序数据库的东西非常好,它想拿到上面这个数据库中的东西,怎么办呢??这个时候ContentProvider的作用就发挥出来了
以下程序实现访问ContentProvider_Dome_one
1、新建一个工程,在Activity中获取内容解析者
2、在xml中布局中,设置4个Button,方便测试
3、在Activity中监听对应的Button,实现对应的方法
代码实现如下:
项目名:ContentProvider_Dome_Two
1、新建一个工程,在Activity中获取内容解析者
public class MainActivity extends AppCompatActivity { ContentResolver contentResolver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /**ContentResolver内容解析者 * 1.获取内容解析者*/ contentResolver = getContentResolver(); }
2、在xml中布局中,设置4个Button,方便测试
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:onClick="insert_but" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加"/> <Button android:onClick="delete_but" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除"/> <Button android:onClick="update_but" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="修改"/> <Button android:onClick="query_but" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询"/></LinearLayout>
3、在Activity中监听对应的Button,实现对应的方法
public void query_but(View view){//查询 Uri uri = Uri.parse("content://voi.name/query"); /** * Uri uri : content://voi.name(填写注册的authority)/query(方法的标记) * String[] projection 列名 * String[] selection 查询条件 * String[] selectionArgs 查询条件的值 * String sortOrder 排序 */ Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(0); int age = cursor.getInt(1); Log.d("MainActivity_dome", name + "我是其他程序" + age); } } } public void insert_but(View view){//增加 Uri uri=Uri.parse("content://voi.name/insert"); ContentValues values=new ContentValues(); values.put("name","coco"); values.put("age",12); contentResolver.insert(uri,values); } public void delete_but(View view){//删除 Uri uri=Uri.parse("content://voi.name/delete"); contentResolver.delete(uri,"name=?",new String[]{"coco"}); } public void update_but(View view){//修改 Uri uri=Uri.parse("content://voi.name/update"); ContentValues values=new ContentValues(); values.put("age",2); contentResolver.update(uri,values,"name=?",new String[]{"coco"}); }
- Android四大组件之内容提供者--ContentProvider
- Android四大组件之内容提供者ContentProvider
- Android四大组件之内容提供者--ContentProvider
- android四大组件之内容提供者(ContentProvider)
- Android四大组件之一之内容提供者ContentProvider
- Android四大组件之ContentProvider(内容提供者)01
- Android四大组件之ContentProvider(内容提供者)02
- 四大组件之内容提供者ContentProvider
- Android四大组件之一ContentProvider(内容提供者)
- android四大组件之一内容提供者contentprovider
- Android四大组件ContentProvider 内容提供者
- Android组件之ContentProvider(内容提供者)
- 四大组件之内容提供者——ContentProvider
- 浅析Android四大组件之一:ContentProvider 内容提供者 源码
- Android四大组件之----内容提供者
- Android四大组件之内容提供者
- Android之四大组件之一-ContentProvider内容提供者的使用(二)
- Android个人每天总结.doc(day04四大组件之:内容提供者ContentProvider)
- HTTP协议 (三) Request
- 项目管理----计划------WPS画甘特图做任务排期
- UIScrollView详解以及判断向上滑动还是向下滑动
- 山东省第八届 ACM 省赛 quadratic equation (水、坑)
- MySQL 加锁处理分析
- Android四大组件之内容提供者--ContentProvider
- opencv 读取视频、打开摄像头、写入视频文件
- 实验 21 VLAN 间的路由—单臂路由
- SwipeMenuListView实现类似于QQ侧滑删除效果
- 设计模式之——装饰者模式
- BZOJ 4517: [Sdoi2016]排列计数 组合数 错排公式
- 基于snmp的反射攻击的理论及其实现
- 对Word的方框里打钩标记
- JSP UEditor图片在线管理及预览时图片路径问题解决