Android学习笔记-----------内容提供者

Android学习笔记-----------内容提供者

简介

内容提供者主要用于在不同的程序之间实现数据共享的功能;
一个程序想要访问其他程序种由内容提供者提供的数据,必须依赖于contentresolver这个类的实例,可以通过getContentResolver()这个方法来获取这个类的实例;
这个类提供有query(),insert(),update(),delete()等方法来操作数据
这些方法都需要提供个Uri类型的参数,这个Uri对应的就是你需要操作的数据引用.
一个uri主要由以以下几个部分组成:

content://com.example.myprovider.provider/student/1

scheme: content://

authority: com.example.myprovider.provider

权限表示代表你需要访问的是哪个内容提供者

path: /student/1

路径代表的是你需要访问的表明为student中的id为1的字段
如果需要的是student中所有的数据,则path可以写成/student

为其他程序提供一个自己的内容提供者

1.创建一个类,使其继承ContentProvider

2.实现其方法

  • public boolean onCreate() {
      }
  • public Cursor query(Uri uri, String[] projection, String selection,
      String[] selectionArgs, String sortOrder) {
      return null;
      }
  • public String getType(Uri uri) {
      return null;
      }
  • public Uri insert(Uri uri, ContentValues values) {
      return null;
      }
  • public int delete(Uri uri, String selection, String[] selectionArgs) {
      return 0;
      }
  • public int update(Uri uri, ContentValues values, String selection,
      String[] selectionArgs) {
      return 0;
      }

3.在清单文件中注册内容提供者

1 <!-- 需要设置exported属性为true,否则其他程序访问时会出现权限问题-->
2         <provider
3             android:name="com.example.myprovider.provider.MyProvider"
4             android:authorities="com.example.myprovider.provider"
5             android:exported="true"
6             ></provider>

其他说明会在具体代码中说明:

  1 public class MyProvider extends ContentProvider {
  2     public static final int STUDENT_DIR = 0;
  3     public static final int STUDENT_ITEM = 1;
  4     public static final String AUTHORITY = "com.sjj.myprovider.provider";
  5     private static MyOpenHelper openHelper;
  6     private static UriMatcher uriMatcher;
  7     //通过静态代码块初始化
  8     static {
  9         // UriMatcher.NO_MATCH表示不匹配任何路径的返回码 = -1
 10         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 11         uriMatcher.addURI(AUTHORITY, "student", STUDENT_DIR);// 查全部
 12         // #是通配符,表示任意数字
 13         uriMatcher.addURI(AUTHORITY, "student/#", STUDENT_ITEM);// 查某一列
 14     }
 15
 16     @Override
 17     public boolean onCreate() {
 18         // 在oncreate方法里面创建或者拿到数据库对象
 19         openHelper = new MyOpenHelper(getContext());
 20         return false;
 21     }
 22     /**
 23      * 查询数据的方法
 24      */
 25     @Override
 26     public Cursor query(Uri uri, String[] projection, String selection,
 27             String[] selectionArgs, String sortOrder) {
 28         SQLiteDatabase db = openHelper.getReadableDatabase();
 29         Cursor cursor = null;
 30         //使用uriMatcher.match()方法来匹配uri
 31         switch (uriMatcher.match(uri)) {
 32         case STUDENT_DIR:
 33             cursor = db.query("student", projection, selection, selectionArgs,
 34                     null, null, sortOrder);
 35             break;
 36         case STUDENT_ITEM:
 37             // uri.getPathSegments().get(1)依次提取出PATH的各个部分的字符串,以"/"为标记,以字符串数组的形式输出。
 38             String sid = uri.getPathSegments().get(1);
 39             cursor = db.query("student", projection, "sid = ?",
 40                     new String[] { sid }, null, null, sortOrder);
 41             break;
 42         default:
 43
 44             break;
 45         }
 46         return cursor;
 47     }
 48     /**
 49      * 添加数据的方法
 50      */
 51     @Override
 52     public Uri insert(Uri uri, ContentValues values) {
 53         SQLiteDatabase db = openHelper.getWritableDatabase();
 54         Uri returnUri = null;
 55         switch (uriMatcher.match(uri)) {
 56         case STUDENT_DIR:
 57         case STUDENT_ITEM:
 58             long newStudentId = db.insert("student", null, values);
 59             returnUri = Uri.parse("content://" + AUTHORITY + "/student/"
 60                     + newStudentId);
 61             break;
 62         default:
 63             break;
 64         }
 65         return returnUri;
 66     }
 67
 68     /**
 69      * 删除数据的方法
 70      */
 71     @Override
 72     public int delete(Uri uri, String selection, String[] selectionArgs) {
 73         SQLiteDatabase db = openHelper.getWritableDatabase();
 74         int deleteNum = 0;
 75         switch (uriMatcher.match(uri)) {
 76         case STUDENT_DIR:
 77             deleteNum = db.delete("student", selection, selectionArgs);
 78             break;
 79         case STUDENT_ITEM:
 80             String sid = uri.getPathSegments().get(1);
 81             deleteNum = db.delete("student", "sid = ?", new String[] { sid });
 82             break;
 83         default:
 84             break;
 85         }
 86         return deleteNum;
 87     }
 88
 89     /**
 90      * 修改数据的方法
 91      */
 92     @Override
 93     public int update(Uri uri, ContentValues values, String selection,
 94             String[] selectionArgs) {
 95         SQLiteDatabase db = openHelper.getWritableDatabase();
 96         int updateNum = 0;
 97         switch (uriMatcher.match(uri)) {
 98         case STUDENT_DIR:
 99             updateNum = db.update("student", values, selection, selectionArgs);
100             break;
101         case STUDENT_ITEM:
102             String sid = uri.getPathSegments().get(1);
103             updateNum = db.update("student", values, "sid = ?",
104                     new String[] { sid });
105             break;
106         default:
107             break;
108         }
109         return updateNum;
110     }
111
112     /*
113      *gettype()是所有内容提供者都必须提供的一个方法,用于获取对象所对应的MIME类型.一个内容
114      *URI所对应的MIME所对应的MIME字符创主要由三个部分组成.android对他们做了以下要求:
115      *1.必须以vnd开头
116      *2.如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以ID结尾,则后android.cursor.item/
117      *3.最后跟上上vnd.authority.path*/
118     @Override
119     public String getType(Uri uri) {
120         String stringType = null;
121         switch (uriMatcher.match(uri)) {
122         case STUDENT_DIR:
123             stringType = "vnd.android.cursor.dir/vnd."+AUTHORITY+".student";            break;
124         case STUDENT_ITEM:
125             stringType = "vnd.android.cursor.item/vnd."+AUTHORITY+".srudent";
126             break;
127         default:
128             break;
129         }
130         return stringType;
131     }

其他程序如何调用内容提供者

1 //添加操作
2             uri = Uri.parse("content://com.sjj.myprovider.provider/student");
3             ContentValues values = new ContentValues();
4             values.put("sname", "张三");
5             //获取ContentResolve对象并执行indsert方法
6             Uri uri1 =  getContentResolver().insert(uri, values);
7             String insertid  = uri1.getPathSegments().get(1);
 1 //查询操作
 2             uri = Uri.parse("content://com.sjj.myprovider.provider/student");
 3             //获取ContentResolve对象并执行query方法
 4             Cursor cursor = getContentResolver().query(uri, null, null, null, null, null);
 5             if(cursor != null){
 6                 while(cursor.moveToNext()){
 7                     String sname = cursor.getString(cursor.getColumnIndex("sname"));
 8                     Log.i("MainActivity", "sname------"+sname);
 9                 }
10             }
时间: 2024-10-09 23:25:27

Android学习笔记-----------内容提供者的相关文章

Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容

一.什么是ContentProvider? ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件访问类似,都是共享应用程序数据,不同的是之前的两种文件格式可能完全不同,如可能为xml,txt,sql等等,这里ContentProvider返回的数据格式是统一的,因此应用的更为广泛一点. 二.实例 这里使用的是A应用通过ContentProvider共享数据给B应用.这里A应用用的是前文中的an

Android学习笔记(四八):提供自己的Content Provider

在上一次的学习中,采用了原生的内容提供者Contact,Contact有多层映射关系,比较复杂,并非作为小例子的好选择,在本次学习中,我们将学习如何建立Content Provider,并通过Uri进行增删改查.如果应用的数据只需自己使用,并不需要content provider,相反避免这样做,可直接访问数据:但是若希望数据可以被其他应用访问,创建content provider就是常规手段. 再谈Content Provider的Uri 在上一次学习中,我们谈到了Uri的格式.现在已cont

【转】Pro Android学习笔记(五):了解Content Provider(上)

Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider进行读写,需要使用URI.推荐阅读Android学习笔记(四七):Content Provider初谈和Android联系人信息.Android学习笔记(四八):提供自己的Content Provider和Android学习笔记(四九):通过Content Provider访问数据.Content

【转】Pro Android学习笔记(七):了解Content Provider(下上)

我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,author,created_date和modified_date几列.我们通过一个名为BookProvider的内容提供者将数据源运行封装,并对外提供增删改查的接口. 首先:定义Content Provider的结构 创建一个Provider,我们首先需要定义好这个provider的结构.通过consta

Android学习笔记五之Service

Android学习笔记五之Service 1.什么是Service? 什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application comp

Android学习笔记(二二): 多页显示-Tag的使用

在手机屏幕中,Tab也是比较常用的,通常和List结合,例如我们手机的通信录.下面是Tag的结构. TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容. 如果我们使用extends TabAcitivty,如同ListActivity,TabHost必须设置为@android:id/tabhost TabWidget必须设置android:id为@android:id/tabs F

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

udacity android 学习笔记: lesson 4 part b

udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文採用下面协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Mar