contentprovider实例怎么使用group by 查询

访问:405369次
积分:6574
积分:6574
排名:第1162名
原创:253篇
转载:114篇
评论:153条
(1)(6)(1)(1)(1)(1)(1)(3)(4)(14)(1)(5)(7)(3)(8)(5)(1)(1)(5)(3)(4)(7)(25)(9)(3)(11)(8)(1)(1)(3)(5)(1)(2)(1)(4)(2)(7)(17)(3)(1)(8)(9)(1)(3)(24)(9)(5)(18)(11)(10)(83)如何通过contentProvider实现groupby查询数据_百度知道
如何通过contentProvider实现groupby查询数据
提问者采纳
C, numbertype, COUNT(*) FROM calls WHERE (0==0) GROUP BY(number), date,所以要特别注意selection中有括号的情况4 GROUP BY后面的字段应该加括号,
CString selection = &quot:1 关键字“COUNT,(&0==0) GROUP BY (&quot, COUNT(*) FROM calls
GROUP BYrosolver,(date&#47, duration,numberlabel,在ContentRosolver中有些不一样, Calls,
Calls.NUMBER,
&).DATE+&quot.CACHED_NAME.CACHED_NUMBER_LABEL,type, date比如要用实现这么一个sql语句, GROUP BY”的大小写2 COUNT(*) 后需要跟AS ***3 Android会将query中的参数整合成一条sql语句;0000ORDER BY date DESC这个在一般的SQL编译工具里都能正常运行;+
Calls, number。用ContentRosolver中的query这么写:SELECT _id:private static String CALLS_COUNT = &quot,
CALL_LOG_PROJECTION,(&quot, AS:SELECT _id, null.CONTENT_URI.DATE, name,
Calls,注意事项.NUMBER+&quot,
Calls.DURATION.DEFAULT_SORT_ORDER),
Ccalls_count&quot,(type), numbertype,date&#47, null, type, Calls,
C;static final String[] CALL_LOG_PROJECTION = new String[] {
Calls。转化为sql语句正确的形式应该如下;).TYPE+& + CALLS_COUNT
Calls._ID;COUNT(*) AS &quot.query(QUERY_TOKEN.TYPE,用逗号隔开, type,其中会将selection的字符串自动加一个括号,形成 “WHERE(*******)”的形式;&#47, name, selection.CACHED_NUMBER_TYPE, duration
网络工程师
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您所在的位置: &
9.2.3 利用SQLiteDatabase 对象操作数据库(1)
9.2.3 利用SQLiteDatabase 对象操作数据库(1)
E2ECloud工作室
人民邮电出版社
《深入浅出Google Android》第9章为有源头话水来――使用SQLite、ContentProvider与Preferences处理数据,这一章我们将来认识Android平台是如何对数据进行处理的。包括文件I/O操作,如何在程序中实现数据库相关的操作,以及如何使用Preferences来存取数据。本节为大家介绍利用SQLiteDatabase 对象操作数据库。
9.2.3 利用SQLiteDatabase 对象操作数据库(1)
获得了SQLiteDatabase对象以后,我们就可以通过调用SQLiteDatabase的实例方法来对数据库进行操作了。SQLiteDatabase除了提供像execSQL()和rawQuery()这种直接对SQL语句解析的方法外,还针对INSERT、UPDATE、DELETE和SELECT等操作专门定义了相关的方法。下面是对常用的数据库操作方法的总结。
public void execSQL (String sql),public void execSQL (String sql, Object[]bindArgs),执行一条非查询SQL语句,执行期间会获得该SQLite数据库的写锁,执行完毕后锁释放。不支持用;隔开的多条SQL语句。若SQL语句执行失败会抛出SQLException异常。
参数:sql,需要执行的SQL语句字符串。
bindArgs,SQL语句中表达式的?占位参数列表,仅仅支持String、byte数组、long和double型数据作为参数。
返回值:无。
public Cursor rawQuery (String sql, String[] args),public Cursor rawQuery-WithFactory(SQLiteDatabase.CursorFactory factory, String sql, String[]args, String editTable),执行一条SQL查询语句,并把查询结果以Cursor的子类对象的形式返回。
参数:sql,需要执行的SQL语句字符串。
args,SQL语句中表达式的?占位参数列表,参数只能为String类型。
factory,CursorFactory对象,用来构造查询完毕时返回的Cursor的子类对象,为null时使用默认的CursorFactory构造。
editable,第一个可编辑的表名。
返回值:指向第一行数据之前的Cursor子类对象。
public long insert (String table, String nullColumnHack, ContentValuesinitialValues),public long insertOrThrow (String table, String nullColumnHack,
ContentValues initialValues),向指定表中插入一行数据。
参数:table,需要插入数据的表名。
nullColumnHack,这个参数需要传入一个列名。SQL标准并不允许插入所有列均为空的一行数据,所以当传入的initialValues值为空或者为0时,用nullColumnHack参数指定的列会被插入值为NULL的数据,然后再将此行插入到表中。
initalValues,用来描述要插入行数据的ContentValues对象,即列名和列值的映射。
返回值:新插入行的行id。如果有错误发生返回-1。
public int update (String table, ContentValues values, String whereClause,String[] whereArgs),更新表中指定行的数据。
参数:table,更新数据的表名。
values,用来描述更新后的行数据的ContentValues对象,即列名和列值的映射。whereClause,可选的where语句(不包括WHERE关键字),用来指定需要更新的行。若传入null则表中所有的行均会被更新。
whereArgs,where语句中表达式的?占位参数列表,参数只能为String类型。返回值:被更新的行的数量。
public int delete (String table, String whereClause, String[] whereArgs),删除表中指定的行。
参数:table,需要删除行的表名。
whereClause,可选的where语句(不包括WHERE关键字),用来指定需要删除的行。
若传入null则会删除所有的行。
whereArgs,where语句中表达式的?占位参数列表,参数只能为String类型。
返回值:若传入了正确的where语句则被删除的行数会被返回。若传入null,则会返回0。若要删除所有行并且返回删除的行数,则需要在where语句的地方传入字符串1。
public Cursor query (String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy,String limit)public Cursor query (boolean distinct, String table, String[] columns,String selection, String[] selectionArgs, String groupBy, String having,String orderBy, String limit)public Cursor query (String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy)public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory,boolean distinct, String table, String[] columns, String selection, String[]selectionArgs, String groupBy, String having, String orderBy, String limit)
根据检索条件检索指定表并把满足条件的行以Cursor的子类对象返回。参数:table,检索的表名。
columns,由需要返回列的列名所组成的字符串数组,传入null会返回所有的列。selection,指定需要返回的行的where语句(不包括WHERE关键字)。传入null则返回所有行。
selectionArgs,where语句中表达式的?占位参数列表,参数只能为String类型。
groupBy,对结果集进行分组的group by语句(不包括GROUP BY关键字)。传入null将不对结果集进行分组。
having,对分组结果集设置条件的having语句(不包括HAVING关键字)。必须配合groupBy参数使用,传入null将不对分组结果集设置条件。
orderBy,对结果集进行排序的order by语句(不包括ORDER BY关键字)。传入null将对结果集使用默认的排序。
limit,对返回的行数进行限制的limit语句(不包括LIMIT关键字)。传入null将不限制返回的行数。
distinct,如果希望结果集没有重复的行传入true,否则传入false。
cursorFactory,使用这个CursorFactory来构造返回的Cursor子类对象,传入null使用默认的CursorFactory。
返回值:指向第一行数据之前的Cursor子类对象。
了解了这些函数,下面让我们来把数据库的操作填充到之前的MyHelper骨架中,并且在程序中利用MyHelper创建并打开数据库名为code.db的数据库,最后向数据库中的countrycode表插入数据,如表9-1所示。
表9-1 countrycode表中包含的数据
&首先新建项目SQLite2,把之前MyHelper的骨架复制到MyHelper.java,在MyHelper类中为表名和列名定义字符串静态常量。
public&static&final&String&TB_NAME&=&"countrycode"; &public&static&final&String&ID&=&"_id"; &public&static&final&String&COUNTRY&=&"country"; &public&static&final&String&CODE&=&"code";&
【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
PC机应用开发技术方兴未艾,手机操作平台一波又起,Google Andro
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
思想决定行为,行为决定习惯,习惯决定性格,性格决定
我们之所以感受到折磨,是因为我们失去了对真我的察觉
UMLChina 首席专家潘加宇的第一本书。作者在为软件组
本书是一本以示例形式直接面向应用的网络管理图书。书中以大量示例和大量实用网络管理与故障排除经验介绍了当前网络管理工作的各
51CTO旗下网站Android四种存储方式: sharedpreference,file,SQlite,contentprovider。1、SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/&包名&/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:  一、根据Context获取SharedPreferences对象  二、利用edit()方法获取Editor对象。  三、通过Editor对象存储key-value键值对数据。  四、通过commit()方法提交数据。  具体实现代码如下:实现存储,读取,清除,删除效果图:首先创建:// 首先拿到sharedpreference对象&&&&& mShared =getSharedPreferences(SHARED_MAIN_XML,&MODE_PRIVATE);存储:&private&void&write()&{//&存入数据&&&&&&savename&=&name.getText().toString().trim();&&&&&&saveage&=&Integer.valueOf(age.getText().toString().trim());&&&&&&Editor&editor&=&mShared.edit();&&&&&&editor.putString("name",&savename);&&&&&&editor.putInt("age",&saveage);&&&&&&//&保证操作的事务完整性&&&&&&mit();&&&}阅读:private&String&read()&{//&从数据库里读取数据&&&&&&namecontent&=&mShared.getString("name",&"数据库里没有存储姓名");&&&&&&agecontent&=&mShared.getInt("age",&0);&&&&&&String&reading&=&"姓名:"&+&namecontent&+&"\n年龄:"&+&&&&&&&return&&&&}清除内容:private&void&clear()&{//清除内容&&&&&&/**&开始清除SharedPreferences中保存的内容&**/&&&&&&Editor&editor&=&mShared.edit();&&&&&&editor.remove("name");&&&&&&editor.remove("age");&&&&&&mit();&&&&}删除文件:private&void&delete()&{//删除文件&&&&&&/**&删除SharedPreferences文件&**/&&&&&&Filefile&=&new&File("/data/data/cn.csdn.activity"&+&"/shared_prefs/"&&&&&&&&&&&&+&SHARED_MAIN_XML&+&".xml");&&&&&&if&(file.exists())&{&&&&&&&&&file.delete();&&&&&&&&&Toast.makeText(this,&"删除成功",&Toast.LENGTH_LONG).show();&&&&&&}&&&}haredPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。2、 File:&即常说的文件(I/O)存储方法,常用存储大数量的数据,但是缺点是更新数据将是一件困难的事情。下面实现:在本地data文件下使用自己生成的文件处理数据的新建储存 读取 删除如果说不想把内容存在SharedPreferences中的话,我们可以自己写一个文件保存须要的数据,在这里我将文件保存在系统中的工程路径下。跟上面布局一样,删除文件也一样,清除内容也查不多,下面只是简单的写和读的方法:写:String&nameage="名字:"+name.getText().toString().trim()+"年龄:"+age.getText().toString();&&&&&&try&{&&&&&&&&&os&=&this.openFileOutput(SHARED_MAIN_XML,&MODE_PRIVATE);&&&&&&&&&/*&把字符串转换成字节数组,写入文件中&*/&&&&&&&&&os.write(nameage.getBytes());&&&&&&}&catch&(FileNotFoundException&e)&{&&&&&&&&&e.printStackTrace();&&&&&&}&catch&(IOException&e)&{&&&&&&&&&e.printStackTrace();&&&&&&}finally&{&&&&&&&&&try&{&&&&&&&&&&&&/*&关闭文件输出流&*/&&&&&&&&&&&&os.close();&&&&&&&&&}&catch&(IOException&e)&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&}&&&&&&}&读:private&String&read()&{&&&&&&String&nameage="";&&&&&&//&打开文件输入流,&&&&&&try&{&&&&&&&&&is&=&this.openFileInput(SHARED_MAIN_XML);&&&&&&&&&/*&初始化字节数组&*/&&&&&&&&&b&=&new&byte[1024];&&&&&&&&&/*&从文件输入流中读取内容到字节数组中,返回内容长度&*/&&&&&&&&&int&length&=&is.read(b);&&&&&&&&&/*&把字节数组转换成字符串&*/&&&&&&&&&nameage=&new&String(b);&&&&&&}&catch&(FileNotFoundException&e)&{&&&&&&&&&e.printStackTrace();&&&&&&}&catch&(IOException&e)&{&&&&&&&&&e.printStackTrace();&&&&&&}&&&&&&return&&&&}很简单吧!!3、 SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:    NULL: 空值    INTEGER: 整数    REAL: 浮点数    TEXT: 字符串    BLOB: 大数据它是一个轻量级的数据库、非常小 、 移植性好、效率高、可靠在Android系统中提供了android.database.sqlite包,用于进行SQLite数据库的增、删、改、查工作。创建与删除数据库封装一个类去继承SQLiteOpenHelper& 在构造函数中传入数据库名称与数据库版本号,数据库被创建的时候会调用onCreate(SQLiteDatabase db) 方法,数据库版本号发生改变的时候会调用onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion)方法,可以方便的对软件游戏升级后做出相应处理避免覆盖安装数据库发生改变产生的错误。调用SQLiteOpenHelper& 的getReadableDatabase()方法去创建数据库,如果数据库不存在则创建并且返回SQLiteDatabase对象,如果数据库存在则不创建只返回SQLiteDatabase对象。调用 deleteDatabase(DATABASE_NAME)方法 传入数据库名称则可删除数据库。第一种:详细请看上一遍博客:下面介绍第二种:另一种添删改查操作效果图:布局文件很简单,在此不再给出!!直接给创建数据库和表,增删改查的代码:public&class&UserService&{&&&private&DatabaseHelper&&&&&public&UserService(Context&context,&String&name,&int&version)&{&&&&&&helper&=&new&DatabaseHelper(context,&name,&version);&&&}&&&public&UserService(Context&context,&String&name)&{&&&&&&helper&=&new&DatabaseHelper(context,&name);&&&}&&&&public&void&insert(UserDao&user)&{//&插入数据&&&&&&SQLiteDatabase&sdb&=&helper.getWritableDatabase();&&&&&&ContentValues&values&=&new&ContentValues();&&&&&&values.put("username",&user.getUsername());&&&&&&values.put("password",&user.getPassword());&&&&&&sdb.insert("user",&"name",&values);&&&&&&&sdb.close();&&&}&&&&public&void&delete(int&id)&{//&删除数据&&&&&&SQLiteDatabase&sdb&=&helper.getWritableDatabase();&&&&&&sdb.delete("user",&"id=?",&new&String[]{String.valueOf(id)});&&&&&&sdb.close();&&&}&&&&public&void&update(UserDao&user,&int&id)&{//&更新数据&&&&&&SQLiteDatabase&sdb&=&helper.getWritableDatabase();&&&&&&ContentValues&values=new&ContentValues();&&&&&&values.put("username",&user.getUsername());&&&&&&values.put("password",&user.getPassword());&&&&&&sdb.update("user",&values,&"id=?",&new&String[]{String.valueOf(id)});&&&&&&sdb.close();&&&}&&&&public&Cursor&select()&{//&查询所有数据&&&&&&SQLiteDatabase&sdb&=&helper.getWritableDatabase();&&&&&&&&&&&return&&&&sdb.query("user",&new&String[]{"id&as&_id","username","password"},&null,&null,&null,&null,&null);&&&}&&&public&UserDao&find(int&id){//按id查询数据&&&&&&UserDao&user=null;&&&&&&SQLiteDatabase&sdb=helper.getWritableDatabase();&&&&&&Cursor&cursor=sdb.query("user",&new&String[]{"id","username","password"},&"id=?",&new&String[]{String.valueOf(id)},&null,&null,&null);&&&&&&&&&if(cursor.moveToFirst()){&&&&&&&&&user=new&UserDao();&&&&&&&&&user.setId(cursor.getInt(0));&&&&&&&&&user.setUsername(cursor.getString(1));&&&&&&&&&user.setPassword(cursor.getString(2));&&&&&&}&&&&&&cursor.close();&&&&&&sdb.close();&&&&&&return&&&&}}&&&插入数据:通过insert(String table, StringnullColumnHack, ContentValues values)方法插入数据,其中参数含义分别为:    table: 目标表名    nullColumnHack:&指定表中的某列列名。因为在SQLite中,不允许不允许插入所有列均为null的记录,因此初始值有值为空时,此列需显式赋予null    values:ContentValues对象,类似于java中的Map。以键值对的方式保存数据。修改数据: update(String table,ContentValues values, String whereClause, String[] whereArgs)方法用于修改数据,其四个参数的具体含义如下:    table: 目标表名    values:&要被修改成为的新值    whereClause:where子句,除去where关键字剩下的部分,其中可带?占位符。如没有子句,则为null。    whereArgs: 用于替代whereClause参数中?占位符的参数。如不需传入参数,则为null。查询数据:query()方法用SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。除了表名,其他参数可以是 null。所以,以前的代码段可以可写成:&String[] columns={"ID","inventory"};&String[] parms={"snicklefritz"};&Cursor result=db.query("widgets",columns, "name=?",parms, null, null, null);使用游标不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:通过使用 getCount() 方法得到结果集中有多少记录;通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;通过 getColumnNames() 得到字段名;通过 getColumnIndex() 转换成字段号;通过 getString(),getInt() 等方法得到给定字段当前记录的值;通过 requery() 方法重新执行查询得到游标;通过 close() 方法释放游标资源;删除数据:删除数据也是一件很简单的事,只需要调用delete方法,传入参数即可,delete(String table, String whereClause,String[] whereArgs)的参数三个参数具体含义如下:    table: 目标表名    whereClause:where子句,除去where关键字剩下的部分,其中可带?占位符。如没有子句,则为null。    whereArgs: 用于替代whereClause参数中?占位符的参数。如不需传入参数,则为null。4、contentproviderContentProvider概念1、& ContentProvider提供为存储和获取数据提供了统一的接口;2、& 使用ContentProvider可以在不同的应用程序之间共享数据3、& Android为常见的一些数据提供了ContentPrivider(包括音频,视频,图片和通讯录等等)ContentProvider使用表的形式来组织数据Uri1、& 每一个ContentProvider都拥有一个公共的uri,这个uri用于表示这个ContentProvider所提供的数据2、& Android所提供的ContentProvider都存放在android.provider包当中Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:要操作contact表中id为10的记录,可以构建这样的路径:/contact/10要操作contact表中id为10的记录的name字段, contact/10/name要操作contact表中的所有记录,可以构建这样的路径:/contact要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uriuri =Uri.parse("content://com.changcheng.provider.contactprovider/contact")&ContentProvider所提供的函数:1、& query():查询2、& insert():插入3、& update():更新4、& delete():删除5、& getType():得到数据类型6、& onCreate():创建时的回调函数实现ContentProvider的过程1、& 定义一个CONTENT_URI常量2、& 定义一个类,继承ContentProvider3、& 实现query,insert,update,delete,getType,onCreate方法4、& 在AndroidManifest.xml当中进行声明下面是实现代码:首先创建继承contentprovider的类UserContentProvider&.javapublic&class&UserContentProvider&extends&ContentProvider&{&&&private&DatabaseHelper&&&&private&SQLiteDatabase&&&&private&static&UriMatcher&matcher&=&new&UriMatcher(UriMatcher.NO_MATCH);&&&private&static&final&int&USERS&=&1;&&&private&static&final&int&USER&=&2;&&&static{&&&&&&matcher.addURI("cn.csdn.activity.providers.userprovider",&"user",&USERS);&&&&&&matcher.addURI("cn.csdn.activity.providers.userprovider",&"user/#",&USER);&&&}&&&public&int&delete(Uri&uri,&String&selection,&String[]selectionArgs)&{&&&&&&db=helper.getWritableDatabase();&&&&&&int&num=0;&&&&&&switch(matcher.match(uri)){&&&&&&case&USERS:&&&&&&&&&num=db.delete("user",&selection,&selectionArgs);&&&&&&&&&break;&&&&&&case&USER:&&&&&&&&&long&id=ContentUris.parseId(uri);&&&&&&&&&String&where="id="+&&&&&&&&&if(selection!=null&&!"".equals(selection)){&&&&&&&&&&&&where=where+"&and"+&&&&&&&&&}&&&&&&&&&num=db.delete("user",&where,&selectionArgs);&&&&&&&&&break;&&&&&&default:&&&&&&&&&throw&new&IllegalArgumentException("Unknown&Uri:"+&uri);&&&&&&}&&&&&&return&&&&}&&&&public&String&getType(Uri&uri)&{&&&&&&switch(matcher.match(uri)){&&&&&&case&USERS:&&&&&&&&&return&"vnd.android.cursor.dir/person";&&&&&&case&USER:&&&&&&&&&return&"vnd.android.cursor.item/person";&&&&&&default:&&&&&&&&&throw&new&IllegalArgumentException("Unknown&Uri:"+&uri);&&&&&&}&&&}&&&&public&Uri&insert(Uri&uri,&ContentValues&values)&{&&&&&&db=helper.getWritableDatabase();&&&&&&long&&&&&&&switch(matcher.match(uri)){&&&&&&case&USERS:&//向表中添加新纪录并返回其行号&&&&&&&&&rowid=db.insert("user",&"id",&values);&&&&&&&&&return&ContentUris.withAppendedId(uri,&rowid);&&&&&&default:&&&&&&&&&throw&new&IllegalArgumentException("Unknow&Uri:"&+&uri);&&&&&&}&&&&&&&}&&&&public&boolean&onCreate()&{&&&&&&helper=new&DatabaseHelper(this.getContext(),"users.db");&&&&&&return&true;&&&}&&&&public&Cursor&query(Uri&uri,&String[]&projection,&Stringselection,&&&&&&&&&String[]&selectionArgs,&String&sortOrder)&{&&&&&&db&=&helper.getReadableDatabase();&&&&&&switch(matcher.match(uri)){&&&&&&case&USERS:&&&&&&&&&return&db.query("user",&projection,&selection,&selectionArgs,&null,&null,&sortOrder);&&&&&&case&USER:&&&&&&&&&long&id=ContentUris.parseId(uri);&&&&&&&&&String&where="id="+&&&&&&&&&if(selection!=null&&!"".equals(selection)){&&&&&&&&&&&&where=where+"&and"+&&&&&&&&&}&&&&&&&&&return&db.query("user",&projection,&where,&selectionArgs,&null,&null,&sortOrder);&&&&&&default:&&&&&&&&&throw&new&IllegalArgumentException("Unknown&Uri:"+&uri);&&&&&&}&&&}&&&&public&int&update(Uri&uri,&ContentValues&values,&String&selection,&&&&&&&&&String[]&selectionArgs)&{&&&&&&db=helper.getWritableDatabase();&&&&&&int&&&&&&&switch(matcher.match(uri)){&&&&&&case&USERS:&&&&&&&&&num=db.update("user",&values,&selection,&selectionArgs);&&&&&&&&&break;&&&&&&case&USER:&&&&&&&&&long&id=ContentUris.parseId(uri);&&&&&&&&&String&where="id="+&&&&&&&&&if(selection!=null&&!"".equals(selection)){&&&&&&&&&&&&where=where+"&and"+&&&&&&&&&}&&&&&&&&&num=db.update("user",&values,&selection,&selectionArgs);&&&&&&&&&break;&&&&&&default:&&&&&&&&&throw&new&IllegalArgumentException("Unknow&Uri"+uri);&&&&&&}&&&&&&return&&&&}}配置manifest.xml:需要在&application&&/application&中为provider进行注册!!!!provider&android:authorities="cn.csdn.activity.providers.userprovider"&&&&&&&&&&&&android:name="UserContentProvider"&&/provider&最后写测试类://contentprovider测试&&&public&void&testinsert(){//插入数据&&&&&&ContentResolver&resolver&=&this.getContext().getContentResolver();&&&&&&Uri&inserturi=Uri.parse("content://cn.csdn.activity.providers.userprovider/user");&&&&&&ContentValuesvalues=new&ContentValues();&&&&&&values.put("username",&"renhiali");&&&&&&values.put("password",&"123");&&&&&&Uri&uri=resolver.insert(inserturi,&values);&&&&&&Log.i("TAG",&uri.toString());&&&}&&&public&void&testdelete(){//删除数据&&&&&&ContentResolver&resolver&=&this.getContext().getContentResolver();&&&&&&Uri&deleteuri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/7");&&&&&&int&num=resolver.delete(deleteuri,&null,&null);&&&&&&Log.i("TAG",&num+"");&&&}&&&public&void&testupdate(){//更新数据&&&&&&ContentResolver&resolver&=&this.getContext().getContentResolver();&&&&&&Uri&uri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/8");&&&&&&ContentValuesvalues=new&ContentValues();&&&&&&values.put("username",&"123");&&&&&&resolver.update(uri,&values,&null,&null);&&&}&&&public&void&testquery(){//查询数据&&&&&&ContentResolver&resolver&=&this.getContext().getContentResolver();&&&&&&Uri&uri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/4");&&&&&&Cursor&cursor=resolver.query(uri,&null,&null,&null,&null);&&&&&&cursor.moveToFirst();&&&&&&Log.i("TAG",cursor.getString(1));&&&&&&cursor.close();&&&}&源代码下载地址:url:&&
阅读(...) 评论()}

我要回帖

更多关于 contentprovider权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信