应用开发-快速入门-android基础笔记_第1页
应用开发-快速入门-android基础笔记_第2页
应用开发-快速入门-android基础笔记_第3页
应用开发-快速入门-android基础笔记_第4页
应用开发-快速入门-android基础笔记_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android-ContentProvider简介ontentProvider即内容提供者,是Androd的四大组件之一。内容提供者是应用程序AndroidProvder专为不同应用程序提供联系人数据;设置Provider专为不同应用程序提供系统配置信息,包括内置的设置应用程序等。当应用继承ontentProvder类,并重写该类用于提供数据和数方式会因数据 的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用ShredPreferences共享数据,需要使用ShredPreferencesAPI读写数据。而使用onentProvider共享数据的好处是 了数据 方式。创建一个ContentProvider的使用,下面将编写一个案例,跟着案例一点点学习ContentProvider的用法,相信当大家能独自把该案例写出来的时候也是基本掌握ContentProvider使用方法的时候。 部程序可以通过提供的ContentProvider接口对的 新创建一个AndroidMyContentProvider在vider.dao包下新建一 OpenHelper类继publicpublicOpenHelperOpenHelperOpenHelper(Contextcontext,StringCursorFactoryfactory,intversion)super(context,name,factory,}@param OpenHelper(Contextsuper(context, .db",null,}publicvoidDatabasedb)Stringsql="create (idintegerprimary}publicvoidonUpgrade(newVersion){Databasedb,intoldVersion,}}在com.itheima.contenPvider包中创建,ContentProvider承ContentProvider类。同时将该Provider在AndroidManifest.xml中 rson" 类是业务代码,也是本文档的重要内容,代码如下publicContentProviderextendsContentProvider作privatestaticUriMatcherOpenHelperauthoritiesprivatestaticfinalStringAUTHORITY=//privatestaticfinalString_NAME=privatestaticfinal_INSERT_CODE=privatestaticfinal_DELETE_CODE=privatestaticfinal_UPDATE_CODE=privatestaticfinal_QUERYALL_CODE=privatestaticfinal_QUERYONE_CODE=matcher=new//matcher.addURI(AUTHORITY,//表进行删除操作,matcher.addURI(AUTHORITY,//表进行修改操作,matcher.addURI(AUTHORITY,// 表进行查询所有操作,如果 matcher.addURI(AUTHORITY, // 表进行查询单个操作,如果 matcher.addURI(AUTHORITY, }publicbooleanonCreate()openHelper= return}String[]selectionArgs,StringsortOrder){intmatchCode=Databasedb=switch(matchCode) returndb.query(TABLE_ _NAME,projection,selection,selectionArgs,null,null,sortOrder); longparseId=return _NAME,projection,"id=?",String[]{parseId+""},null,null,thrownewIllegalArgumentException("Uri}}publicUriinsert(Uriuri,ContentValues Databasedb=// longid=db.insert(TABLE_ _NAME,null,values);returnContentUris.withAppendedId(uri,}}publicintdelete(Uriuri,Stringselection,String[]selectionArgs){Databasedb=intcount=db.delete(TABLE_ _NAME,selection,}String[]selectionArgs){Databasedb=intcount=db.update(TABLE_ _NAME,values,selection,}publicStringgetType(Uriuri)return}}1.2UriContentResolverUrischema,用来说明一个ContentProvider控制这些数据。"content://" path:路径,URIpath:路径,URIItemID:通常定义Uri时使用”#”号占位符代替 使用时替换成对应的数1.1新创建一个AndroidTestContentProvider在AndroidManifest.xml和uses-library:其中instrumentation文件的manifest节点下uses- <uses-library,中实现方法,调用1.1章节中ContentProvider。,测试insert方法publicvoidContentResolverresolver=getContext().getContentResolver();Uriuri= ContentValuesvalues=newContentValues();values.put("name"," values.put("age", values.put("address",Uriinsert=resolver.insert(uri,publicvoidContentResolverresolver=getContext().getContentResolver();Uriuri= ContentValuesvalues=newContentValues();values.put("name"," values.put("age", values.put("address",Uriinsert=resolver.insert(uri,longid= }java.lang.SecurityException:PermissionDenial:opening

thatisnotexportedfromuid10091atandroid.os.Parcel.readException(Parcel.java:1425)atandroid.os.Parcel.readException(Parcel.java:1379)atAapublicpublicvoidContentResolverresolver=getContext().getContentResolver();Uriuri= ContentValuesvalues=newContentValues();values.put("name"," intcount=resolver.update(uri,values,"name=?", }deletepublicpublicvoidContentResolverresolver=getContext().getContentResolver();Uriuri= intcountresolver.delete(uri"id=?"newString[]{"1"});System.out.println("删除的个数为:"+count);}测试query(单个)publicpublicvoidContentResolverresolver=getContext().getContentResolver();Uriuri=Uri.parse(" .itheimrson//2");Cursorcursor=resolver.query(uri,newString[]{"name","age","phone","address"},null,null,null);Stringname= intage= Stringphone=curs Stringaddress=curs }}测试query(多个)方法22的备份和恢复Android 、恢 备份到XML件中,同时XML在按钮,程序会将XML信到中2.1publicvoidContentResolverresolver=getContext().getContentResolver();Uriuri=Uri.parse(" Cursorcursor=resolver.query(uri,newString[]{"name","age","phone","address"},null,null,null);Stringname= intage= Stringphone=curs Stringaddress=curs }}打开Android源码,查看packages\providers\路径下的工程,这些就是Android系 ephonyProvider就是的内容提供者文件。打开 privatestaticfinalUriMatchersURLMatchernewstaticsURLMatcher.addURI("sms",null,SMS_ALL);sURLMatcher.addURI("sms","#",SMS_ALL_ID);sURLMatcher.addURI("sms","inbox",SMS_INBOX);sURLMatcher.addURI("sms","inbox/#",SMS_INBOX_ID);sURLMatcher.addURI("sms","sent",SMS_SENT);sURLMatcher.addURI("sms","sent/#",SMS_SENT_ID);sURLMatcher.addURI("sms","draft",SMS_DRAFT);sURLMatcher.addURI("sms","draft/#",SMS_DRAFT_ID);sURLMatcher.addURI("sms","outbox",SMS_OUTBOX);sURLMatcher.addURI("sms","outbox/#",SMS_OUTBOX_ID);sURLMatcher.addURI("sms","undelivered",sURLMatcher.addURI("sms","failed",SMS_FAILED);sURLMatcher.addURI("sms","failed/#",SMS_FAILED_ID);sURLMatcher.addURI("sms","queued",SMS_QUEUED);sURLMatcher.addURI("sms","conversations",sURLMatcher.addURI("sms","raw",SMS_RAW_MESSAGE);sURLMatcher.addURI("sms","atta ents",SMS_ATTA sURLMatcher.addURI("sms","atta sURLMatcher.addURI("sms","threadID/*",sURLMatcher.addURI("sms","status/#",SMS_STATUS_ID);sURLMatcher.addURI("sms","sr_pending",sURLMatcher.addURI("sms","icc",SMS_ALL_ICC);sURLMatcher.addURI("sms","icc/#",SMS_ICC);//wekeepthesefornotbreakingoldapplicationssURLMatcher.addURI("sms","sim",SMS_ALL_ICC);sURLMatcher.addURI("sms","sim/#",SMS_ICC);在数据库中在数据库中sms息容提供者的Uri应该为查看Android模拟器下的 ephony,查看打开数据库,其中sms 的就"sms.bodyASsnippet");"sms.thread_idASthread_id");"groups.msg_countASmsg_count");sConversationProjectionMap.put("delta",}}其中,address的是联系人号码,date是发送日期,type对应的类型(发送/接收),body是的主体内容,准备备份这四项。2.2新创建一个新的Android工程《 备份And恢复》,包名创建XML工具类,用于生成XML和解析XML编写界创建XML工具类,用于生成XML和解析XML编写界面布局文件,这里使用默认生成的布局文 tools:context=".MainActivity"> 备份和恢复"/>publicclassSms{privateStringbody;privateStringaddress;privateStringdate;privateStringtype;}publicclassSms{privateStringbody;privateStringaddress;privateStringdate;privateStringtype;} 编写默认的MainActivity类,实现 publicpublicvoidbackupSms(Viewview)if(backupFlag)} 线程中操作可能会导致ANR异常newThread(newRunnable()publicvoidrun()backupFlag=ContentResolverresolver= 的Uriuri=Cursorcursor=resolver.query(uri,new{"address","date","body","type"},null,null,null);List<Sms>list=newArrayList<Sms>(); intcount= inti=0;while{Smssms=newStringaddress=curs Stringdate=curs Stringbody=curs Stringtype=curs }try 保存到xml}catch(Exception{e.printStackTrace();Toast.makeText(MainActivity.this,"备份 失败。"+e.getLocalizedMessage(),}Toast.makeText(MainActivity.this," 了"+i+"条 。",1).show();//flasebackupFlag}}publicvoidreverseSms(Viewview)publicvoidreverseSms(Viewview)if(reverseFlag){Toast.makeText(this"当前}newThread(new{publicvoid{ContentResolverresolver=Uriurl=Uri.parse("content://sms");List<Sms>list=null;trylist=Sms2XmlUtil.xml2Sms();}catch(Exception{e.printStackTrace();Toast.makeText(MainActivity.this," 恢复失败!+e.getLocalizedMessage(),}inti=for(Smss:list)ContentValuesvalues=newUriuri=resolver.insert(url,values); 的id:"+}Toast.makeText(MainActivity.this," 了"+i+"条 。",1).show();reverseFlag=false;}}为当前工程 限。在AndroidManifest.xml中 <uses-permission<uses-permission 通过DDMS, 可以看到在mnt/sdcard/smsbackup 下多了sms.xml文件。::在该工程中 的恢复逻辑比较简单,只是把sms.xml文件中的所到这样处理的结果是数据库中有了2份相同的。操作系统联系人通过DDMS,查看Android模拟器下的viders.contacts包下的数据库,查看其contact2.dbraw_contacts中的每一条id对应的具体信息,不同类型的信息由mimetype_idraw_contactsmimetypes打开Android源码,查看packages\providers\路径下的文件,其中 打开文件,寻找联系人的内容提供者对应的是哪个java文件<providerandroid:name="ContactsProvider2" ermission="android.permission.GLOBAL_SEARCH" ermission="android.permission.GLOBAL_SEARCH" ermission="android.permission.GLOBAL_SEARCH"<grant-uri-permissionandroid:pathPattern=".*"打开ContactsProvider2.java文件,查看此内容提供者的uri"contacts/#/data",CONTACTS_DATA);"raw_contacts",RAW_CONTACTS);"raw_contacts/#",RAW_CONTACTS_ID);"raw_contacts/#/data",RAW_CONTACTS_DATA);操作raw_contacts表的Uri: :由于contacts2.db数据库使用了视图,所以操作数 比如:data表在查询的时候没有mimetype_id,取代的是操作raw_contacts表,获取全部的根据获取到的每一条id去查询data通过代码给系统联系 一条联系人信新建一个使用默认生成的布局文件和MainActivity ListView中,因此 需要为ListView的Item创建一个布局文件,由于该布局文件比较简单,因此只给出 tools:context=".MainActivity">android:layout_weight="1">android:orientation="horizontal">android:text="获取联系人"/> 联系人"/>想想还是将list_item.xml的布局给出吧,哎,了 >>>> publicclassMainActivityextendsActivityistViewpublicclassMainActivityextendsActivityistViewist<Contact>privateMyAdapterprivateHandlerhandler=newHandler()publicvoidhandleMessage(android.os.MessageToast.makeText(MainActivity.this"数据获取成功。",protectedvoidonCreate(Bundle{super.onCreate(savedInstanceState);lv=(ListView)findViewById(R.id.lv);list=newArrayList<Contact>();adapter=newMyAdapter();}publicvoidqueryContacts(Viewview)newThread(newRunnable()publicvoidrun()Uriuri= Cursorcursor=contentResolver.query(uri,new{"contact_id"},null,null,inti=while{//先从raw_contacts表中获取contact_idStringcontact_id=curs if(TextUtils.isEmpty(contact_id)){}Cursorcursor2= ta"),newString[]{"data1","mimetype"},"contact_id=?",newString[]{contact_id},null);Contactcontact=newwhile(cursor2.moveToNext())Stringdata=Stringmimetype=("vnd.android.cursor.item/name".equals(mimetype))}else("vnd.android.cursor.item/phone_v2".equals(mimetype))}else _v2".equals(mimetype)) }else}}}//发送一个空消息,更新ListView}}classMyAdapterextends{publicintgetCount()return}publicObjectgetItem(intposition)return}publiclonggetItemId(intposition)return}publicViewgetView(intposition,ViewconvertView,ViewGroupparent){Viewview;if(convertView!={view=holder=(ViewHolder)}elseview=View.inflate(MainActivity.this,R.layout.list_item,null);holder=newViewHolder();holder.tv_name=(TextView)holder.tv_phone=(TextView) =(TextView) }Contactcontact=list.get(position); returnview;}}class{TextViewtv_name;TextViewtv_ TextViewtv_phone;}*往系统联系人表中 publicvoidinsertContacts(Viewview) 来Contactcontact=newContact();contact.set contact.setName(""+newRandom().nextInt(1000));contact.setPhone("9999999"+newRandom().nextInt(100));contact.setOther("市中关村园");ContentResolverresolver=Uriraw_uri= Uridata_uri= // Cursorcursor=resolver.query(raw_uri,new{"contact_id"},null,null,"contact_iddesclimitintid=if(cursor!=null)boolean = if )id= }}// intnewId=id+//给raw_contact表中添加一天记录ContentValuesvaluesnewContentValues();values.put("contact_id",newId);resolver.insert(raw_uri,values);datavalues=newContentValues();values.put("raw_contact_id",newId);values.put("data1",contact.getName());resolver.insert(data_uri,values);values=newvalues.put(values.put("raw_contact_id",values.put("data1",contact.getPhone());resolver.insert(data_uri,values);values=newContentValues();resolver.insert(data_uri,values);values=newContentValues();values.put("mimetype","vnd.android.cursor.item/ values.put("data1",contact.get resolver.insert(data_uri,values);Toast.makeText(this"联系人contact}}在AndroidManifest.xml中添加添加如下权限:<uses-permission系人。发现不仅成功的将所有的联系人出来了同时也将新联系人到了数据中44ContentObserver简介),当所观察的与它所的UriMIMEType有关的。学习过ContentProvider(内容提供者)的都知道,可以通过UriMatcher类可以分为:返回多条数据的Uri、返回单条数据的Uri。使用ContentObserver的步骤我这里总结如下:UrionChangeContentObserver在下面第5章节中,我将用一个案例来演示ContentObserver5.案例 用户使用系统自带的程序 ,程序会通过ContentProvider把保存进数据库,并且发出一个数据变化通知,使用ContentObserver对数据变化进行,在用 时,就会被ContentObserver

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论