关闭

Android_ContentProvider详解(实现增删改查)

232人阅读 评论(0) 收藏 举报
 

Android_ContentProvider详解(实现增删改查)

标签: UriMatcherUri内容提供者ContentProviderAndroid
 943人阅读 评论(0) 收藏 举报
本文章已收录于: 
 分类:

目录(?)[+]

1.概述

ContentProvider为存储和读取数据提供了统一的接口,实现了程序间的数据共享,而应用程序内部没有必要实现这个功能,直接操作数据库就可以!Android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据,统一了数据访问方式。

2.提供一个ContentProvider

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * PersonProvider.java 
  3.  * 内容提供者 
  4.  */  
  5. public class PersonProvider extends ContentProvider {  
  6.     private SQLiteDatabase db;      //需要操作的数据库  
  7.     private final static int PERSON = 1;  
  8.     private final static int PERSONID = 2;  
  9.     private final static int DELPERSONID = 3;  
  10.     private final static int PERSONS = 4;  
  11.     //  1.定义一个静态常量字段Uri匹配器,用以匹配uri  
  12.     private final static UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);  //如果都匹配不成功,则返回构造函数中指定的参数值,默认为-1  
  13.     //  2.静态代码块  
  14.     static{  
  15.         /* 
  16.          * Add a URI to match, and the code to return when this URI is matched.  
  17.          * 使用"*"去匹配任意的文本数据,或者使用"#"去匹配任意的数字 
  18.          * MATCHER.addURI(String authority,     //  主机名或者认证 com.baidu.provider.person 
  19.          *                  String path,        //  路径 authority/path 
  20.          *                  int code)           //  与这个authority的path路径想对应的,一个int的数字,使用MATCHER.match(uri) 返回code数字 
  21.          */  
  22.         MATCHER.addURI("com.baidu.provider.person""person", PERSON);  //  
  23.         MATCHER.addURI("com.baidu.provider.person""persons", PERSONS);  
  24.         MATCHER.addURI("com.baidu.provider.person""person/update/#", PERSONID);  
  25.         MATCHER.addURI("com.baidu.provider.person""person/delete/#", DELPERSONID);  
  26.     }  
  27.     //  3.onCreate方法完成provider的初始化动作,主要是数据库的构建  
  28.     @Override  
  29.     public boolean onCreate() {  
  30.         DbOpenHelper dbOpenHelper = new DbOpenHelper(this.getContext());  
  31.         db = dbOpenHelper.getWritableDatabase();  
  32.         return true;  
  33.     }  
  34.       
  35.     /* 
  36.      *  4.覆写需要的方法 
  37.      *      query,insert,delete,update 
  38.      */  
  39.     @Override  
  40.     public Uri insert(Uri uri, ContentValues values) {  
  41.         //4.1 使用uri匹配器去匹配一个uri,根据int返回值来判断具体的操作类型  
  42.         switch (MATCHER.match(uri)) {     
  43.         case PERSON:  
  44.         //4.2与uri想匹配的响应操作  
  45.             long id = db.insert("person""name", values);  //返回id  
  46.             uri = ContentUris.withAppendedId(uri, id);      //返回需求的uri  
  47.             break;  
  48.         default:  
  49.             break;  
  50.         }  
  51.         return uri;  
  52.     }  
  53. }  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <!-- AndroidManifest.xml -->  
  2. <provider android:name=".PersonProvider" android:authorities="com.baidu.provider.person"></provider>  

3.ContentProvider的增删改查

(1).增加操作

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  *  ContentProvider 增操作 
  3.  */  
  4. // 提供者内部方法  
  5. public Uri insert(Uri uri, ContentValues values) {  
  6.     switch (MATCHER.match(uri)) {  
  7.     case PERSON:  
  8.         long id = db.insert("person""name", values);  
  9.         uri = ContentUris.withAppendedId(uri, id);      //注意使用这个简便的操作方法,来生成一个uri  
  10.         break;  
  11.     default:  
  12.         break;  
  13.     }  
  14.     return uri;  
  15. }  
  16. // 使用提供者的内部方法  
  17. public void insertMethod(){  
  18.     ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();  
  19.     Uri uri = Uri.parse("content://com.baidu.provider.person/person");  
  20.     List<String> list = uri.getPathSegments();  
  21.     ContentValues values = new ContentValues();  
  22.     values.put("name""zhang");  
  23.     values.put("age""20");  
  24.     Uri resultUri = resolver.insert(uri, values);  
  25.     if(ContentUris.parseId(resultUri) > 0){      //根据uri,解析出其中的id值  
  26.         show("插入成功!");  
  27.     }else{  
  28.         show("插入失败!");  
  29.     }  
  30. }  
  31. public void show(String info){  
  32.     Toast.makeText(this, info, Toast.LENGTH_SHORT).show();  
  33. }  

(2).删除操作

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  *  ContentProvider 删操作 
  3.  */  
  4. // 提供者内部方法  
  5. public int delete(Uri uri, String selection, String[] selectionArgs) {  
  6.     int resultId = 0;  
  7.     switch (MATCHER.match(uri)) {  
  8.     case DELPERSONID:  
  9.         long id = ContentUris.parseId(uri);     //根据uri对象,解析出其中的id,解析失败返回为-1  
  10.         if(selection != null){  
  11.             selection += (" and _id="+id);  
  12.         }else{  
  13.             selection = ("_id="+id);  
  14.         }  
  15.         resultId = db.delete("person", selection, selectionArgs);   //返回删除成功的行号值  
  16.         break;  
  17.     }  
  18.     return resultId;  
  19. }  
  20. //使用提供者的内部方法  
  21. public void deleteMethod(){  
  22.     ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();  
  23.     Uri uri = Uri.parse("content://com.baidu.provider.person/person/delete/6");  
  24.     int id = resolver.delete(uri, nullnull);  
  25.     if(id > 0){  
  26.         show("删除成功!");  
  27.     }else{  
  28.         show("删除失败!");  
  29.     }  
  30. }  
  31. public void show(String info){  
  32.     Toast.makeText(this, info, Toast.LENGTH_SHORT).show();  
  33. }  

(3).更新操作

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  *  ContentProvider 更新操作 
  3.  */  
  4. // 提供者内部方法  
  5. public int update(Uri uri, ContentValues values, String selection,  
  6.         String[] selectionArgs) {  
  7.     int resultId = 0;  
  8.     switch (MATCHER.match(uri)) {  
  9.     case PERSONID:  
  10.         long id = ContentUris.parseId(uri);  
  11.         if(selection != null){  
  12.             selection += (" and _id="+id);  
  13.         }else{  
  14.             selection = ("_id="+id);  
  15.         }  
  16.         resultId = db.update("person", values, selection, selectionArgs);  
  17.         break;  
  18.     default:  
  19.         break;  
  20.     }  
  21.     return resultId;  
  22. }  
  23. //使用提供者的内部方法  
  24. public void updateMethod(){  
  25.     ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();  
  26.     Uri uri = Uri.parse("content://com.baidu.provider.person/person/update/5");  
  27.     ContentValues values = new ContentValues();  
  28.     values.put("name""li");  
  29.     values.put("age""24");  
  30.     int id = resolver.update(uri, values, nullnull);  
  31.     if(id > 0){  
  32.         show("更新成功!");  
  33.     }else{  
  34.         show("更新失败!");  
  35.     }  
  36. }  
  37. public void show(String info){  
  38.     Toast.makeText(this, info, Toast.LENGTH_SHORT).show();  
  39. }  

(4).查询操作

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  *  ContentProvider 查询操作 
  3.  */  
  4. // 提供者内部方法  
  5. public Cursor query(Uri uri, String[] projection, String selection,  
  6.         String[] selectionArgs, String sortOrder) {  
  7.     Cursor cursor = null;  
  8.     switch (MATCHER.match(uri)) {  
  9.     case PERSONS:  
  10.         cursor = db.query("person", projection, selection, selectionArgs, nullnull, sortOrder);  
  11.         break;  
  12.     default:  
  13.         break;  
  14.     }  
  15.     return cursor;  
  16. }  
  17. //使用提供者的内部方法  
  18. ContentResolver resolver = MainActivity.this.getApplicationContext().getContentResolver();  
  19. Uri uri = Uri.parse("content://com.baidu.provider.persons");  
  20. Cursor cursor = resolver.query(uri, nullnullnullnull);  
  21. if(cursor != null){  
  22.     list.setAdapter(new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor, new String[]{"_id""name""age"}, new int[]{R.id.id, R.id.name, R.id.age}));  
  23.     show("查询成功!");  
  24. }else{  
  25.     show("查询失败!");  
  26. }  
  27. public void show(String info){  
  28.     Toast.makeText(this, info, Toast.LENGTH_SHORT).show();  
  29. }  

4.内容观察者

在listView中,使用内容提供者动态更新数据
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ContentResolver resolver = getContentResolver();  
  2. Uri uri = Uri.parse("content://sms/");  
  3. resolver.registerContentObserver(uri, truenew ContentObserver(new Handler()) {  
  4.     @Override  
  5.     public void onChange(boolean selfChange) {  
  6.         super.onChange(selfChange);  
  7.         /* 
  8.          * 发送一个Message对象 
  9.          * 有handler对对象进行处理 
  10.          */  
  11.     }  
  12. });  

5.操作示意图

                

0
0
查看评论

Android_ContentProvider详解

Android_ContentProvider详解 一、概述: Contentprovider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据,其他应用程序通过使用ContentResolver根据Uri去访问操...
  • husheng0
  • husheng0
  • 2015-06-12 15:50
  • 372

Android_ContentProvider

一、ContentProvider的概念   ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider   1、ContentProvider使用表的形式来组织数据    无论数据...
  • niohandsome
  • niohandsome
  • 2016-11-26 20:21
  • 33

android_ContentProvider

gfampogmpoamgp
  • wu15111685657
  • wu15111685657
  • 2017-07-17 22:07
  • 51

最简单的jsp+servlet的增删改查代码

package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; impor...
  • qq_33599520
  • qq_33599520
  • 2016-12-23 13:40
  • 3447

VB与ADO的用法 (增删改查)

Dim cn As New ADODB.ConnectionDim rs As ADODB.RecordsetPrivate Sub CmdAdd_Click()    Dim sname, stel, saddr As String   ...
  • chouwa_wa
  • chouwa_wa
  • 2011-06-02 10:29
  • 1409

JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数

一 需求分析 二 编写 Java Project 三 建立数据库层 db层 测试数据库连接 我的数据库连接类-DBUtil 四 建立模型层 model层 五 建立数据库访问层 dao层 测试 dao 层代码 六 建立控制层 action层 测试 action 层代码 七 建立视图层 view层 项目...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016-10-06 21:48
  • 2089

JavaScript之实现基本的增删改查功能

开心一笑 听说这两天,全国都很冷。福建人说1度好冷,北京人笑了:我们这零下17度。黑龙江人也笑了:我们这零下33度。呼伦贝尔人听到哈哈大笑:我们这零下43度。福建人听完冷笑一声:我说的是室内,室内,室内 视频教程 CSDN学院: http://edu.csdn.net/lectur...
  • huangwenyi1010
  • huangwenyi1010
  • 2016-05-06 17:57
  • 12967

ajax实现增删改查的一个实例

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> http://www.w3.org/1999/xhtml">         ...
  • rogerzhanglijie
  • rogerzhanglijie
  • 2013-03-11 08:10
  • 12691

AngularJS实现对用户信息的增删改查

var app=angular.module("myApp",["ngRoute"]);             var user=[    ...
  • dongjinjindongjinjin
  • dongjinjindongjinjin
  • 2017-09-21 10:16
  • 932

mybatis系列一:mybatis实现增删改查

Java实例-Mybatis的增删改查
  • wanlong360599336
  • wanlong360599336
  • 2017-05-04 16:47
  • 1047
    个人资料
    • 访问:34091次
    • 积分:632
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:50篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论