zoukankan      html  css  js  c++  java
  • 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             }
  • 相关阅读:
    静态构造函数
    js-----Date对象
    JS中Math函数的常用方法
    js 简单数据类型和复杂数据类型的区别
    js new关键字 和 this详解
    JS 对象的三种创建方式
    js 预解析
    JS作用域问题
    js实现斐波那契数列
    JS 三元表达式
  • 原文地址:https://www.cnblogs.com/Jhope/p/5336825.html
Copyright © 2011-2022 走看看