Android组件系列----ContentProvider内容提供者【3】

(3)【核心】新建类PersonContentProvider,继承ContetProvider

PersonContentProvider.java:

复制代码
  1 package com.example.contentprovidertest01;
  2 
  3 import com.example.contentprovidertest01.dao.PersonDao;
  4 
  5 import android.content.ContentProvider;
  6 import android.content.ContentUris;
  7 import android.content.ContentValues;
  8 import android.content.UriMatcher;
  9 import android.database.Cursor;
 10 import android.net.Uri;
 11 import android.os.Bundle;
 12 import android.util.Log;
 13 
 14 public class PersonContentProvider extends ContentProvider {
 15 
 16     private final String TAG = "PersonContentProvider";
 17     private PersonDao personDao = null;
 18     private static final UriMatcher URI_MATCHER = new UriMatcher(
 19             UriMatcher.NO_MATCH);// 默认的规则是不匹配的
 20     private static final int PERSON = 1; // 操作单行记录
 21     private static final int PERSONS = 2; // 操作多行记录
 22     // 往UriMatcher中添加匹配规则。注意,这里面的url不要写错了,我就是因为写错了,半天没调试出来。哎···
 23     static {
 24         // 添加两个URI筛选
 25         URI_MATCHER.addURI("com.example.contentprovidertest01.PersonContentProvider",
 26                 "person", PERSONS);
 27         // 使用通配符#,匹配任意数字
 28         URI_MATCHER.addURI("com.example.contentprovidertest01.PersonContentProvider",
 29                 "person/#", PERSON);
 30     }
 31 
 32     public PersonContentProvider() {
 33 
 34     }
 35 
 36     @Override
 37     public boolean onCreate() {
 38         // 初始化一个数据持久层
 39         personDao = new PersonDao(getContext());
 40         //Log.i(TAG, "--->>onCreate()被调用");
 41         return true;
 42     }
 43 
 44     @Override
 45     public Uri insert(Uri uri, ContentValues values) {
 46         Uri resultUri = null;
 47         // 解析Uri,返回Code
 48         int flag = URI_MATCHER.match(uri);
 49         switch (flag) {
 50         case PERSONS:
 51             //调用数据库的访问方法   
 52             long id = personDao.insertPerson(values); //执行插入操作的方法,返回插入当前行的行号
 53             resultUri = ContentUris.withAppendedId(uri, id);
 54             Log.i(TAG,"--->>插入成功, id=" + id);
 55             Log.i(TAG,"--->>插入成功, resultUri=" + resultUri.toString());
 56             System.out.println("insert success");
 57             break;
 58         }
 59         return resultUri;
 60     }
 61 
 62     //方法:删除记录。注:参数:selection和selectionArgs是查询的条件,是由外部(另一个应用程序)传进来的
 63     @Override
 64     public int delete(Uri uri, String selection, String[] selectionArgs) {
 65         int count = -1;
 66         try {
 67             int flag = URI_MATCHER.match(uri);
 68             switch (flag) {
 69             case PERSON:
 70                 // delete from student where id=?
 71                 // 单条数据,使用ContentUris工具类解析出结尾的Id
 72                 long id = ContentUris.parseId(uri);
 73                 String where_value = "id = ?";
 74                 String[] args = { String.valueOf(id) };
 75                 count = personDao.deletePerson(where_value, args);
 76                 break;
 77             case PERSONS:
 78                 count = personDao.deletePerson(selection, selectionArgs);
 79                 break;
 80             }
 81         } catch (Exception e) {
 82             e.printStackTrace();
 83         }
 84         Log.i(TAG, "--->>删除成功,count=" + count);
 85         return count;
 86     }
 87 
 88     @Override
 89     public int update(Uri uri, ContentValues values, String selection,
 90             String[] selectionArgs) {
 91         int count = -1;
 92         try {
 93             int flag = URI_MATCHER.match(uri);
 94             switch (flag) {
 95             case PERSON:
 96                 long id = ContentUris.parseId(uri);
 97                 String where_value = " id = ?";
 98                 String[] args = { String.valueOf(id) };
 99                 count = personDao.updatePerson(values, where_value, args);
100                 break;
101             case PERSONS:
102                 count = personDao
103                         .updatePerson(values, selection, selectionArgs);
104                 break;
105             }
106         } catch (Exception e) {
107             e.printStackTrace();
108         }
109         Log.i(TAG, "--->>更新成功,count=" + count);
110         return count;
111     }
112 
113     @Override
114     public Cursor query(Uri uri, String[] projection, String selection,
115             String[] selectionArgs, String sortOrder) {
116         Cursor cursor = null;
117         try {
118             int flag = URI_MATCHER.match(uri);
119             switch (flag) {
120             case PERSON:
121                 long id = ContentUris.parseId(uri);
122                 String where_value = " id = ?";
123                 String[] args = { String.valueOf(id) };
124                 cursor = personDao.queryPersons(where_value, args);
125                 break;
126             case PERSONS:
127                 cursor = personDao.queryPersons(selection, selectionArgs);
128                 break;
129             }
130         } catch (Exception e) {
131             e.printStackTrace();
132         }
133         Log.i(TAG, "--->>查询成功,Count=" + cursor.getCount());
134         return cursor;
135     }
136 
137     @Override
138     public String getType(Uri uri) {
139         int flag = URI_MATCHER.match(uri);
140         switch (flag) {
141         case PERSON:
142             return "vnd.android.cursor.item/person"; // 如果是单条记录,则为vnd.android.cursor.item/
143                                                         // + path
144 
145         case PERSONS:
146             return "vnd.android.cursor.dir/persons"; // 如果是多条记录,则为vnd.android.cursor.dir/
147                                                         // + path
148         }
149         return null;
150     }
151 
152     @Override
153     public Bundle call(String method, String arg, Bundle extras) {
154         Log.i(TAG, "--->>" + method);
155         Bundle bundle = new Bundle();
156         bundle.putString("returnCall", "call被执行了");
157         return bundle;
158     }
159 }
复制代码

18行的UriMatcher类的作用是:匹配内容uri,默认的规则是不匹配的。UriMatcher提供了一个addURI方法:

  • void android.content.UriMatcher.addURI(String authority, String path, int code)

这三个参数分别代表:权限、路径、和一个自定义代码。一般第一个参数是uri(包名.内容提供者的类名),第二个参数一般是数据库的表名。

27行:匹配规则的解释:*表示匹配任意字符,#表示匹配任意数字注:如果内部的匹配规则越多,越容易访问。

138行的getType(Uri uri)方法:所有的内容提供者都必须提供的一个方法。用于获取uri对象所对应的MIME类型。

然后,每编写一个内容提供者,都必须在清单文件中进行声明。在AndroidManifest.xml中<application>节点中增加,格式如下:

<provider
    android:name=".内容提供者的类名"
    android:authorities="包名.内容提供者的类名" >
</provider>

第3行表示的是uri路径,毕竟Contet Provider是通过路径来访问的。

所以在本程序中,在AndroidManifest.xml的<application>节点中增加如下代码:

<provider
  android:name=".PersonContentProvider"
  android:authorities="com.example.contentprovidertest01.PersonContentProvider" >
</provider>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值