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
- Android组件系列----ContentProvider内容提供者【3】
- Android组件系列----ContentProvider内容提供者【1】
- Android组件系列----ContentProvider内容提供者【2】
- Android组件系列----ContentProvider内容提供者【4】
- Android组件系列----ContentProvider内容提供者【5】
- Android组件系列----ContentProvider内容提供者
- Android组件系列----ContentProvider内容提供者
- Android 组件 ContentProvider 内容提供者
- Android四大组件之一ContentProvider(内容提供者)
- Android四大组件之内容提供者--ContentProvider
- Android组件之ContentProvider(内容提供者)
- Android四大组件之内容提供者ContentProvider
- android四大组件之一内容提供者contentprovider
- Android四大组件ContentProvider 内容提供者
- Android四大组件之内容提供者--ContentProvider
- Android ContentProvider(内容提供者)
- android内容提供者ContentProvider
- Android--- ContentProvider(内容提供者)
- OpenShare vs Sharepoint
- NodeJs编写首个服务器程序
- iOS 中bundle 和国际化之间的关系
- spring事物配置
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
- Android组件系列----ContentProvider内容提供者【3】
- svn 分支
- SVN 的 分支 与 合并
- 谈面向对象 v0.1
- 全门户,全整合
- 虚拟机内存要如何设置
- Android组件系列----ContentProvider内容提供者【4】
- 【转】SQL Server 数据库内部版本号
- oracle查看用户权限等