一个ContentProvider的典型结构分析
最近查看了Android Sdk中提供的NoteList示例代码,里面有一个ContentProvider的示例蛮经典的,所以进行下结构分析,让印象更深刻些,免得以后把较为复杂的ContentProvider用法弄忘了。^-^。
转载请注明出处:http://blog.csdn.net/nieweilin
一、字段部分
代码:
1 publicclassNotePadProviderextendsContentProvider{ 2 3 privatestaticfinalStringTAG="NotePadProvider"; 4 5 privatestaticfinalStringDATABASE_NAME="note_pad.db"; 6 privatestaticfinalintDATABASE_VERSION=2; 7 privatestaticfinalStringNOTES_TABLE_NAME="notes"; 8 9 privatestaticHashMapString,String>sNotesProjectionMap; 10 privatestaticHashMapString,String>sLiveFolderProjectionMap; 11 12 privatestaticfinalintNOTES=1; 13 privatestaticfinalintNOTE_ID=2; 14 privatestaticfinalintLIVE_FOLDER_NOTES=3; 15 16 privatestaticfinalUriMatchersUriMatcher;
二、静态初始化语句块部分
代码:
1 static{ 2 sUriMatcher=newUriMatcher(UriMatcher.NO_MATCH); 3 sUriMatcher.addURI(NotePad.AUTHORITY,"notes",NOTES); 4 sUriMatcher.addURI(NotePad.AUTHORITY,"notes/#",NOTE_ID); 5 sUriMatcher.addURI(NotePad.AUTHORITY,"live_folders/notes",LIVE_FOLDER_NOTES); 6 7 sNotesProjectionMap=newHashMapString,String>(); 8 sNotesProjectionMap.put(Notes._ID,Notes._ID); 9 sNotesProjectionMap.put(Notes.TITLE,Notes.TITLE); 10 sNotesProjectionMap.put(Notes.NOTE,Notes.NOTE); 11 sNotesProjectionMap.put(Notes.CREATED_DATE,Notes.CREATED_DATE); 12 sNotesProjectionMap.put(Notes.MODIFIED_DATE,Notes.MODIFIED_DATE); 13 14 //SupportforLiveFolders. 15 sLiveFolderProjectionMap=newHashMapString,String>(); 16 sLiveFolderProjectionMap.put(LiveFolders._ID,Notes._ID+"AS"+ 17 LiveFolders._ID); 18 sLiveFolderProjectionMap.put(LiveFolders.NAME,Notes.TITLE+"AS"+ 19 LiveFolders.NAME); 20 //AddmorecolumnshereformorerobustLiveFolders. 21 }
三,一个SQLiteOpenHelper
代码:
1 /** 2 *Thisclasshelpsopen,create,andupgradethedatabasefile. 3 */ 4 privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{ 5 6 DatabaseHelper(Contextcontext){ 7 super(context,DATABASE_NAME,null,DATABASE_VERSION); 8 } 9 10 @Override 11 publicvoidonCreate(SQLiteDatabasedb){ 12 db.execSQL("CREATETABLE"+NOTES_TABLE_NAME+"(" 13 +Notes._ID+"INTEGERPRIMARYKEY," 14 +Notes.TITLE+"TEXT," 15 +Notes.NOTE+"TEXT," 16 +Notes.CREATED_DATE+"INTEGER," 17 +Notes.MODIFIED_DATE+"INTEGER" 18 +");"); 19 } 20 21 @Override 22 publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ 23 Log.w(TAG,"Upgradingdatabasefromversion"+oldVersion+"to" 24 +newVersion+",whichwilldestroyallolddata"); 25 db.execSQL("DROPTABLEIFEXISTSnotes"); 26 onCreate(db); 27 } 28 } 29 30 privateDatabaseHelpermOpenHelper;
四,方法部分
代码:
1 @Override 2 publicbooleanonCreate(){ 3 mOpenHelper=newDatabaseHelper(getContext()); 4 returntrue; 5 }
1 @Override 2 publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs, 3 StringsortOrder){ 4 SQLiteQueryBuilderqb=newSQLiteQueryBuilder(); 5 qb.setTables(NOTES_TABLE_NAME); 6 7 switch(sUriMatcher.match(uri)){ 8 caseNOTES: 9 qb.setProjectionMap(sNotesProjectionMap); 10 break; 11 12 caseNOTE_ID: 13 qb.setProjectionMap(sNotesProjectionMap); 14 qb.appendWhere(Notes._ID+"="+uri.getPathSegments().get(1)); 15 break; 16 17 caseLIVE_FOLDER_NOTES: 18 qb.setProjectionMap(sLiveFolderProjectionMap); 19 break; 20 21 default: 22 thrownewIllegalArgumentException("UnknownURI"+uri); 23 } 24 25 //Ifnosortorderisspecifiedusethedefault 26 StringorderBy; 27 if(TextUtils.isEmpty(sortOrder)){ 28 orderBy=NotePad.Notes.DEFAULT_SORT_ORDER; 29 }else{ 30 orderBy=sortOrder; 31 } 32 33 //Getthedatabaseandrunthequery 34 SQLiteDatabasedb=mOpenHelper.getReadableDatabase(); 35 Cursorc=qb.query(db,projection,selection,selectionArgs,null,null,orderBy); 36 37 //Tellthecursorwhaturitowatch,soitknowswhenitssourcedatachanges 38 c.setNotificationUri(getContext().getContentResolver(),uri); 39 returnc; 40 }
1 @Override 2 publicStringgetType(Uriuri){ 3 switch(sUriMatcher.match(uri)){ 4 caseNOTES: 5 caseLIVE_FOLDER_NOTES: 6 returnNotes.CONTENT_TYPE; 7 8 caseNOTE_ID: 9 returnNotes.CONTENT_ITEM_TYPE; 10 11 default: 12 thrownewIllegalArgumentException("UnknownURI"+uri); 13 } 14 }
1 @Override 2 publicUriinsert(Uriuri,ContentValuesinitialValues){ 3 //Validatetherequesteduri 4 if(sUriMatcher.match(uri)!=NOTES){ 5 thrownewIllegalArgumentException("UnknownURI"+uri); 6 } 7 8 ContentValuesvalues; 9 if(initialValues!=null){ 10 values=newContentValues(initialValues); 11 }else{ 12 values=newContentValues(); 13 } 14 15 Longnow=Long.valueOf(System.currentTimeMillis()); 16 17 //Makesurethatthefieldsareallset 18 if(values.containsKey(NotePad.Notes.CREATED_DATE)==false){ 19 values.put(NotePad.Notes.CREATED_DATE,now); 20 } 21 22 if(values.containsKey(NotePad.Notes.MODIFIED_DATE)==false){ 23 values.put(NotePad.Notes.MODIFIED_DATE,now); 24 } 25 26 if(values.containsKey(NotePad.Notes.TITLE)==false){ 27 Resourcesr=Resources.getSystem(); 28 values.put(NotePad.Notes.TITLE,r.getString(android.R.string.untitled)); 29 } 30 31 if(values.containsKey(NotePad.Notes.NOTE)==false){ 32 values.put(NotePad.Notes.NOTE,""); 33 } 34 35 SQLiteDatabasedb=mOpenHelper.getWritableDatabase(); 36 longrowId=db.insert(NOTES_TABLE_NAME,Notes.NOTE,values); 37 if(rowId>0){ 38 UrinoteUri=ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI,rowId); 39 getContext().getContentResolver().notifyChange(noteUri,null); 40 returnnoteUri; 41 } 42 43 thrownewSQLException("Failedtoinsertrowinto"+uri); 44 }
1 @Override 2 publicintdelete(Uriuri,Stringwhere,String[]whereArgs){ 3 SQLiteDatabasedb=mOpenHelper.getWritableDatabase(); 4 intcount; 5 switch(sUriMatcher.match(uri)){ 6 caseNOTES: 7 count=db.delete(NOTES_TABLE_NAME,where,whereArgs); 8 break; 9 10 caseNOTE_ID: 11 StringnoteId=uri.getPathSegments().get(1); 12 count=db.delete(NOTES_TABLE_NAME,Notes._ID+"="+noteId 13 +(!TextUtils.isEmpty(where)?"AND("+where+')':""),whereArgs); 14 break; 15 16 default: 17 thrownewIllegalArgumentException("UnknownURI"+uri); 18 } 19 20 getContext().getContentResolver().notifyChange(uri,null); 21 returncount; 22 } 23 24 @Override 25 publicintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]whereArgs){ 26 SQLiteDatabasedb=mOpenHelper.getWritableDatabase(); 27 intcount; 28 switch(sUriMatcher.match(uri)){ 29 caseNOTES: 30 count=db.update(NOTES_TABLE_NAME,values,where,whereArgs); 31 break; 32 33 caseNOTE_ID: 34 StringnoteId=uri.getPathSegments().get(1); 35 count=db.update(NOTES_TABLE_NAME,values,Notes._ID+"="+noteId 36 +(!TextUtils.isEmpty(where)?"AND("+where+')':""),whereArgs); 37 break; 38 39 default: 40 thrownewIllegalArgumentException("UnknownURI"+uri); 41 } 42 43 getContext().getContentResolver().notifyChange(uri,null); 44 returncount; 45 } 46 47 48 }
四,小结
本文撰于2010-1-27晚10点华中科技大学IDream工作室,正值小年,屋外爆竹声声。明天回家,看爸妈。
一个ContentProvider的典型结构分析相关推荐
- 使用一个ContentProvider操作多张表
使用一个ContentProvider操作多张表 在我们开发过程中,通常使用ContentProvider来操作数据.查询数据库中的一张表的数据我们创建一个ContentProvider提供操作,需要 ...
- 完整的开发一个ContentProvider步骤
1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类. 2.向Android系统注册这个"网站",也就是在Androi ...
- 一个通证经济典型案例——移动广告矿机
最近一段时间,我一直在谈一个问题,就是通证经济的适用条件.精炼又精炼之后,我将这个条件描述为"边际效率递增".具体地说,如果有一群人通过互联网建立协作网络,做某一件能够创造价值的事 ...
- Android插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
- UG塑胶模具设计结构分析是如何挤压成型的
UG塑胶模具设计结构分析是如何挤压成型的 概 述 塑料挤出成型是用加热的方法使塑料成为流动状态,然后在一定压力的作用下使它通过塑模,经定型后制得连续的型材.挤出法加工的塑料制品种类很多,如管材.薄膜 ...
- 四大组件之ContentProvider(一)-使用系统提供的ContentProvider
更新时间 修改意见 2016-08-02 陈敏 第1节 ContentProvider介绍 ContentProvider是安卓系统的四大组件之一,可以向其他组件提供数据访问的能力.它就像是一个网站, ...
- android contentprovider 插件化之一
------本文转载自 Android插件化原理解析--contentprovider的插件化 这一系列的文章实在是写的好! 1, 概述 目前为止我们已经完成了Android四大组件中 Ac ...
- ContentProvider插件化
ContentProvider插件化 目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特 ...
- 插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
最新文章
- 成功解决xgboost\core.py, ValueError: feature_names may not contain [, ] or
- Redis单机部署、添加开机自启、配置参数
- c/c++ 字符串分割
- 【STC15库函数上手笔记】9、硬件SPI
- 全面容器化:阿里5年带给我的最大收获
- php 面向对象基础,PHP 面向对象基础
- 小程序切换账户拉取仓库文件的appid提示
- 二叉查找树--插入、删除、查找
- kafka的消费顺序_Kafka原理和实践云平台技术栈13
- 微分方程计算机仿真国内外研究论文,微分方程数值解法毕业论文--开题报告.doc...
- 使用版本控制软件TortoiseSVN对程序和文档进行控制的说明
- win7如何设置通电自动开机_win7系统设置自动开机
- 《运动改造大脑》总结
- GPT分区是什么?如何创建GPT分区
- 关于打开网页FLASH显示叉叉问题
- 怎样测试企业级SSD
- 老笔记本机械硬盘换固态装系统,再战10年!
- 2018-2019-2 20175317 实验三《敏捷开发与XP实践》实验报告
- 【算法•日更•第七期】区间动态规划详解+一本通1570能量项链题解
- 组件数据更新页面未更新的解决方法