• ContentProvider共享数据


      1.ContentProvider  一般服务端设置共享数据,

    当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

      当应用需要通过ContentProvider对外共享数据时,需要以下几步:

      第一步,需要创建一个继承ContentProvider类的子类StudentProvider。

      第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ,ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:

     最好authorities唯一标示写成如下形式: android:authorities="包名.类如 android:authorities="com.example.android_contentprovider2.StudentProvider" 

    <manifest .... >

        <application android:icon="@drawable/icon" android:label="@string/app_name">

            <provider android:name=".StudentProvider" android:authorities=""com.example.contentprovider.StudentProvider"/>

        </application>

    </manifest>

          第三步,需要设置访问内容提供者共享数据的Uri,因为客户端(ContentResolver)只能通过Uri访问数据,即当ContentResolver解析的Uri与内容提供者设置的Uri相配时,才可以操纵内容提供者的共享的数据。设置访问内容提供者共享数据的Uri通过UriMatcher类的方法addURI设置。

      如,

       static private UriMatcher URIMATCHER = new UriMatcher(UriMatcher.NO_MATCH);

        static{
      URIMATCHER.addURI("com.example.contentprovider.StudentProvider", "stu/#", STUDENT);
      URIMATCHER.addURI("com.example.contentprovider.StudentProvider", "stu", STUDENTS);
      }

      第四步,学要重写在新建的子类StudentProvider类中重写父类中ContentProvider以下方法:

         public boolean onCreate()

         public Uri insert(Uri uri, ContentValues values)

         public int delete(Uri uri, String selection, String[] selectionArgs)

         public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

         public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

         public String getType(Uri uri)

       在重写那些方法时,注意getType(Uri)方法,以下是getType方法的介绍:

          public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
          如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
          例如:要得到所有student记录的Uri为content://com.example.contentprovider.StudentProvider/student,那么返回的MIME类型字符串      为"vnd.android.cursor.dir/person"。
          如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
          例如:要得到id为10的student记录的Uri为content://com.example.contentprovider.StudentProvider/student/10,那么返回的MIME类      型字符串应为"vnd.android.cursor.item/student"。

     好了,内容提供者设置好了,我们就可以在另外的应用里共享数据内容了。

    注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。

    2.ContentResolver     一般用于客户端
        当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

    ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法:
      public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
      public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
      public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
      public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的        ContentProvider。

      以下是一个关于实例得源代码:

      在StudentProvider.java文件中:

      

      1 public class StudentProvider extends ContentProvider {
      2 
      3     private final String TAG = "StudentProvider";
      4 
      5     private DbHelper helper = null;
      6 
      7     private static final UriMatcher URI_MATCHER = new UriMatcher(
      8             UriMatcher.NO_MATCH);
      9     private static final int STUDENT = 1;// 操作单条记录
     10     private static final int STUDENTS = 2;// 操作多条记录
     11     static {
     12         URI_MATCHER.addURI(
     13                 "com.example.contentprovider.StudentProvider",
     14                 "student", STUDENTS);
     15 
     16         URI_MATCHER.addURI(
     17                 "com.example.contentprovider.StudentProvider",
     18                 "student/#", STUDENT);
     19     }
     20 
     21     public StudentProvider() {
     22         // TODO Auto-generated constructor stub
     23     }
     24 
     25     @Override
     26     public int delete(Uri uri, String selection, String[] selectionArgs) {
     27         // TODO Auto-generated method stub
     28         int count = -1;// 影响数据库的行数
     29         try {
     30             int flag = URI_MATCHER.match(uri);
     31             SQLiteDatabase database = helper.getWritableDatabase();
     32             switch (flag) {
     33             case STUDENT:
     34                 // content://com.example.android_contentprovider2.StudentProvider/student/1
     35                 // delete from student where id = ? //id 通过客户端传递过来的
     36                 long id = ContentUris.parseId(uri);
     37                 String where_value = " id = " + id;
     38                 if (selection != null && !selection.equals("")) {
     39                     where_value += " and " + selection;
     40                 }
     41                 count = database.delete("student", where_value, selectionArgs);
     42                 break;
     43             case STUDENTS:
     44                 count = database.delete("student", selection, selectionArgs);
     45                 break;
     46             }
     47         } catch (Exception e) {
     48             // TODO: handle exception
     49         }
     50         return count;
     51     }
     52 
     53     @Override
     54     public String getType(Uri uri) {
     55         // TODO Auto-generated method stub
     56         int flag = URI_MATCHER.match(uri);
     57         switch (flag) {
     58         case STUDENT:
     59             return "vnd.android.cursor.item/student";
     60         case STUDENTS:
     61             return "vnd.android.cursor.dir/student";
     62         }
     63         return null;
     64     }
     65 
     66     @Override
     67     public Uri insert(Uri uri, ContentValues values) {
     68         // TODO Auto-generated method stub
     69         // insert into student () (?,?);
     70         Uri resultUri = null;
     71         int flag = URI_MATCHER.match(uri);
     72         switch (flag) {
     73         case STUDENTS:
     74             SQLiteDatabase database = helper.getWritableDatabase();
     75             long id = database.insert("student", null, values);// 插入当前行的行号
     76             resultUri = ContentUris.withAppendedId(uri, id);
     77             break;
     78         }
     79         Log.i(TAG, "---->>" + resultUri.toString());
     80         return resultUri;
     81     }
     82 
     83     @Override
     84     public boolean onCreate() {
     85         // TODO Auto-generated method stub
     86         helper = new DbHelper(getContext());
     87         return true;
     88     }
     89     
     90     @Override
     91     public Cursor query(Uri uri, String[] projection, String selection,
     92             String[] selectionArgs, String sortOrder) {
     93         // TODO Auto-generated method stub
     94         Cursor cursor = null;
     95         try {
     96             SQLiteDatabase database = helper.getReadableDatabase();
     97             int flag = URI_MATCHER.match(uri);
     98             switch (flag) {
     99             case STUDENT:
    100                 long id = ContentUris.parseId(uri);
    101                 String where_value = " id = " + id;
    102                 if (selection != null && !selection.equals("")) {
    103                     where_value += " and " + selection;
    104                 }
    105                 cursor = database.query("student", null, where_value,
    106                         selectionArgs, null, null, null, null);
    107                 break;
    108             case STUDENTS:
    109                 cursor = database.query("student", null, selection,
    110                         selectionArgs, null, null, null);
    111                 break;
    112             }
    113         } catch (Exception e) {
    114             // TODO: handle exception
    115         }
    116         return cursor;
    117     }
    118 
    119     @Override
    120     public int update(Uri uri, ContentValues values, String selection,
    121             String[] selectionArgs) {
    122         // TODO Auto-generated method stub
    123         int count = -1;
    124         try {
    125             // update table set name = ? ,address = ? where id = ?
    126             SQLiteDatabase database = helper.getWritableDatabase();
    127             long id = ContentUris.parseId(uri);
    128             int flag = URI_MATCHER.match(uri);
    129             switch (flag) {
    130             case STUDENT:
    131                 String where_value = " id = " + id;
    132                 if (selection != null && !selection.equals("")) {
    133                     where_value += " and " + selection;
    134                 }
    135                 count = database.update("student", values, where_value,
    136                         selectionArgs);
    137                 break;
    138 
    139             }
    140         } catch (Exception e) {
    141             // TODO: handle exception
    142         }
    143         return count;
    144     }
    145 
    146 }

      在MyTest.java文件中:

     1 public class MyTest extends AndroidTestCase {
     2 
     3     public MyTest() {
     4         // TODO Auto-generated constructor stub
     5     }
     6 
     7     public void insert() {
     8         // 访问内容提供者的步骤:
     9         // 1、需要一个内容解析者
    10         ContentResolver contentResolver = getContext().getContentResolver();
    11         // 使用content://+授权路径
    12         Uri url = Uri
    13                 .parse("content://com.example.contentprovider.StudentProvider/student");
    14         ContentValues values = new ContentValues();
    15         values.put("name", "张三");
    16         values.put("address", "北京");
    17         contentResolver.insert(url, values);
    18     }
    19 
    20     public void delete() {
    21         ContentResolver contentResolver = getContext().getContentResolver();
    22         // 删除单行记录,如果要删除多行记录:content://com.example.contentprovider.StudentProvider/student
    23         Uri uri = Uri
    24                 .parse("content://com.example.contentprovider.StudentProvider/student/1");
    25         contentResolver.delete(uri, null, null);
    26     }
    27 
    28     public void update() {
    29         ContentResolver contentResolver = getContext().getContentResolver();
    30         Uri uri = Uri
    31                 .parse("content://com.example.contentprovider.StudentProvider/student/2");
    32         ContentValues values = new ContentValues();
    33         values.put("name", "李斯");
    34         values.put("address", "上海");
    35         contentResolver.update(uri, values, null, null);
    36     }
    37     
    38     public void query(){
    39         ContentResolver contentResolver = getContext().getContentResolver();
    40         //查询单条记录:content://com.example.contentprovider.StudentProvider/student/2
    41         //查询多条记录:content://com.example.contentprovider.StudentProvider/student
    42         Uri uri = Uri
    43                 .parse("content://com.example.contentprovider.StudentProvider/student");
    44         //select *  from student where id = 2;
    45         Cursor cursor = contentResolver.query(uri, null, null, null, null);
    46         while(cursor.moveToNext()){
    47             System.out.println("---->>"+cursor.getString(cursor.getColumnIndex("name")));
    48         }
    49     }
    50 }
  • 相关阅读:
    飞机大战4-我的子弹
    飞机大战3-我的飞机
    飞机大战1-分析设计
    继承
    常见题
    42个例子算法
    心跳
    tomcat
    service
    URI URL
  • 原文地址:https://www.cnblogs.com/SoulCode/p/5414480.html
Copyright © 2020-2023  润新知