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

来源:互联网 发布:java中写html 编辑:程序博客网 时间:2024/05/22 13:20

(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 = personDao103                         .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     @Override114     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     @Override138     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                                                         // + path144 145         case PERSONS:146             return "vnd.android.cursor.dir/persons"; // 如果是多条记录,则为vnd.android.cursor.dir/147                                                         // + path148         }149         return null;150     }151 152     @Override153     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
原创粉丝点击