[androID] 内容提供者实现
上一节的主机名类似网络上的域名,协议是content://,可以定义一下规则
content://主机名/insert 添加 *** 作
content://主机名/delete 删除 *** 作
content://主机名/query 查询 *** 作
content://主机名/update 修改 *** 作
规则定义好之后,我们需要解析一下这个字符串,系统提供了一个API来匹配这个字符串
UriMatcher类,new出来对象new UriMatcher(code) code是个int,表示未匹配到的返回值,一般使用常量UriMatcher.NO_MATCH是-1,把他定义成静态成员属性。
Uri也可以加个#代表的是数字,使用ContentUris类的parseID()方法取出#的值
定义一个静态代码块来测试一下这个matcher,static{},调用UriMatcher对象的addURI(authoritIEs,path,code)方法,参数authoritIEs是String主机名,path是String *** 作名,code是int匹配成功的返回值一般定义成常量private static final int增删查改四个常量。这个就是添加一组匹配规则
实现的主要方法
1.onCreate()方法
当内容提供者这个类开启的时候回调此方法,初始化数据库帮助对象如PersonsqliteHelper
2.query(uri,projection,selection,selectArgs,sortOrder) (参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序)
方法里面调用matcher对象的match(uri)方法,对所传的uri进行匹配,如果成功就返回上面定义的匹配码,匹配成功调用helper对象的getReadableDatabase()方法获取数据库对象,调用db对象的query(table,columns,selectionArgs,groupby,having,orderBy)方法得到Cursor结果集对象,细节db不要close了,框架会自动关闭
3.getType(uri),返回这个uri的mime类型
返回一条数据return “vnd.androID.cursor.item”
返回一组数据return “vnd.androID.cursor.dir”
测试这个ContentProvIDer,新建一个应用,得到手机的中间人,通过getContentResolver()方法获取ContentResolver对象
调用ContentResolver对象的query(uri,sortOrder)方法,(参数:Uri对象别人传过来的uri,字段,条件,条件对应的参数,排序),返回Cursor对象。
获取Uri对象,通过Uri类的parse(uriString)方法,参数:content://主机名/ *** 作名
While循环Cursor对象。
测试报错权限问题 清单文件加这个 androID:exported="true"
在ddms面板上左侧的进程列表,点击上面工具栏的stop按钮,关闭进程,当我调用ContentProvIDer的时候,进程会再次开启。
大部分时候,我们都没有机会去写这个ContentProvIDer,明白这个原理之后,就要进入重点了,当我们要取出联系人的数据,短信的数据,浏览器书签的数据等的时候,我们就需要使用到它了,通过阅读源代码搞明白他们的Uri和需要传入的参数,更好的使用它
内容提供者:
package com.tsh.database;import androID.content.ContentProvIDer; androID.content.ContentValues; androID.content.UriMatcher; androID.database.Cursor; androID.database.sqlite.sqliteDatabase; androID.net.Uri;public class PersonDbProvIDer extends ContentProvIDer { private static final int INSERT = 1; int SELECT = 2int DELETE = 3int UPDATE = 4static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH); private PersonsqliteOpenHelper helper; static{ //增加一组规则 matcher.addURI("com.tsh.database.personprovIDer","insert",INSERT); matcher.addURI("com.tsh.database.personprovIDer","select"初始化helper @OverrIDe boolean onCreate() { helper= PersonsqliteOpenHelper(getContext()); return false; } 查询public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) { 验证 if(matcher.match(uri)==SELECT){ sqliteDatabase db=helper.getReadableDatabase(); Cursor cursor=db.query("person",null,1)">nullreturn cursor; } ; } @OverrIDe String getType(Uri uri) { Todo auto-generated method stub Uri insert(Uri uri,ContentValues values) { int delete(Uri uri,String[] selectionArgs) { return 0 update(Uri uri,ContentValues values,1)">; }}
测试:
ContentResolver resolver=getContentResolver(); Uri uri=Uri.parse("content://com.tsh.database.personprovIDer/select"); Cursor cursor=resolver.query(uri,1)">); while(cursor.movetoNext()){ String name=cursor.getString(cursor.getColumnIndex("name")); System.out.println("name"+name); } cursor.close();
总结
以上是内存溢出为你收集整理的[android] 内容提供者实现全部内容,希望文章能够帮你解决[android] 内容提供者实现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)