内容提供者的学习_第1页
内容提供者的学习_第2页
内容提供者的学习_第3页
内容提供者的学习_第4页
内容提供者的学习_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第32页 内容提供者的学习在本章中,我们将看看如何在,在程序应用中提供内容。我们将会讨论如何共享这些内容,以及如何访问和修改数据。我们已经从第一章学习到本章,学到了很多知识,当然这章也不例外。数据访问是比事件处理和用户界面设计更为复杂。这是因为它涉及到数据库设计和要求访问数据库安全权限的。事实上,从这一章中,我们将需要修改应用程序的AndroidManifest.xml清单文件,所以要提醒大家马上要进入一些相当复杂的概念和代码设计。我们将会从content providers是Android的一个基本概念开始学习,它们为Android用户做些什么。在此之后,您将学习为了Android应用程序,如何使用SQLite为基础的内容提供者,尽管这已经超出了本章的范围和书籍。Android 内容提供者的概述ContentProvider是安卓开发的专有术语,这就意味着它是仅有的一个数据集,通常以SQLite数据库的形式呈现出来,它是安卓系统的一部分。您也为您的应用程序去创建自己的内容供应者。一个Android内容提供者为您提供了可以访问数据结构,通常被称为数据库。基本步骤如下:1、得到打开数据库权限。2、查询数据。3、访问数据。在访问数据时,你可能会读取数据,写入数据(即改变现有的数据的值),或在数据库结构的基础上添加新的数据和数据类型,在the AndroidManifest.xml文件的安全权限级别范围内。数据可以android内部存储器或外部存储器中,如SD卡,或即使在Android设备本身外的远程外部服务器。数据库和数据库管理系统Android应用的内容提供者提供的数据结构通常是通过数据库管理系统(DBMS)提供。一个DBMS通过管理数据库提供的方法,为用户创建数据库,以及添加由它们数据阅读和写作操作的数据。在Android操作系统内有一个完整的开源DBMS被称为SQLite。这是一个关系数据库管理系统(RDBMS)。一个RDBMS是基于根据表中的数据之间关系可以得出之间的关系。在本章的后面,您将看到如何将数据写入到RDBMS的这些表中。SQLite中的SQL代表结构化查询语言。在“精简版”或“光”的一部分描绘,这是一个“轻量级”版本的数据库管理系统,用于嵌入式应用在消费电子设备,和作为将被用于在计算机系统上的SQL数据库不是一个完整的版本。稍后,我们将会让你学习如何简单地访问数据库中的数据记录和包含它们各自的数据字段内的数据。所有你真正需要了解SQLite的是,它是Android的一个组成部分,你可以用它来存储数据。Android的需要掌握的是为你服务DBMS功能!在一个数据库管理系统,数据存储的最高水平是数据库本身,其中包含的表的行和列的数据。每个表是二维的,在那里一排被称为纪录。在每条记录arefields,整理成列,其中包含各个数据项组成的记录。字段可以包含不同的数据类型,如数字,文字,甚至引用被存储在其他地方的数据。但是,在同一列的其他字段(参见图10-1),每个字段必须包含相同的数据类型。图 10-1关系数据库管理系统注意:可以有一个以上的表在数据库(通常是,由于性能和组织方面的原因)。只能有一个主键(唯一的索引),用于每个表中的每个记录,单条的信息数据可以跨越多个表。举例来说,如果你的密钥或ID是217,您的个人信息和电话信息可以是根据该相同的密钥值存储两个不同的表。注意:一旦数据结构和数据类型建好,就不能在改变数据库结构了,这就是当前加载的数据和类型可能不能添加到新定义的数据结构中,所以在你应该先设计数据结构,数据库设计对于确保你项目成功的重要环节。内容提供者是为Android OS提供了SQLite的使用,因为它结构紧凑,开源的,所以我们要在本章中关注那些。Android创建内容提供者 通过编码使用SQLite数据库可以使android能够处理一些事情,用户希望从他们的手机和平板电脑,如获取地址簿,摄像机图像存储,数字视频存储,音乐库,等等。这些SQLite数据库结构最常见的是联系人数据库。包的基层接口,使我们能够访问到在这些数据结构定义的每个智能电话用户的设置和个性化。显然,在这些结构的数据将是对于完全不同用户的电话。通讯录数据库与提供者联系表10-1列出了在/reference/android/provider /package-sunnary.htmlAndroid开发者网站通讯录数据库的接口。表10-1 Android1.X支持的Contacts 接口接口内容Contacts.OrganizationColumns组织Contacts.GroupsColumns分组Contacts.PeopleColumns联系人Contacts.PhonesColumns电话号码Contacts.PhotosColumns联系人照片Contacts.PresenceColumnsIM存在Contacts.SettingsColumns手机设置Contacts.ContactMethodsCoumns 联系方式Contacts.ExtensionsColumns电话扩展如果你浏览Android文件,你会看到在表10-1中列出的接口都已经被注释弃用。弃用意味着这些类被在新版本的编程语言(如Java类代替)或API(如Android)。新的类替换旧的课程通常是更稳健的或复杂的,有时他们的区别仅在于它们是如何实现的。在Android版本1.X(1.0,1.1,1.5和1.6)和Android版本2.X和3.X(2.0,2.1,2.2和3.0),相关的接口发生了变化。所以,数据库接口,Android 1.X手机和在Android2.X手机工作是不同的(在这种情况下会是更加先进和复杂的功能数据库结构,)。如果你要支持1.5和1.6的手机(如我们所做的在这本书中),您将需要使用表10-1中列出的数据库接口.好消息是,放弃并不意味着不可以的。它更准确的手段这种情况下,不建议一般使用除非你需要支持pre-2.0版本你的Android用户。所以,如果需要支持Android 1.5及以后的手机,你可以使用表10.1中列出的接口他们仍然在2 X(3.X)工作。智能手机。然而,你可能无法访问一些新领域的数据或表,除非你添加新2.X,据库代码中的结构检测什么操作系统用户使用,并有代码段,处理每个(1.X、2.X)不同结构。建议:如果你想使用你的每一个特性,你需要让你的代码适配手机系统的不同版本,使用通用的代码去开发不同版本不同的功能。就Android来说,过时(开发者需要适应一个共同的问题)等同于Android操作系统能够做不同的版本的东西,因而具有不同的功能,可用于每个操作系统级或版本。这是特别流行的Android操作系统版本是不同的支持新的手机和平板电脑硬件的不同特点,需要新的API和现有的API,以支持新的硬件特性赋变化。建议:统的不同版本,使用通用的代码去开发不同版本不同的功能。表10-2列出了在新版本2.X关于调整相关信息的内容提供者,这些取代过时的版本,在表10-1出,并可从相同的Android开发者网站的链接/reference/android/provider/package-summary.html。表10-2 Android 2.x Content Providers接口内容ContactsContract.CommonDataKinds.CommonColumns子类化数据库ContactsContract.ContactsColumns联系人主要信息ContactsContract.ContactOptionsColumns联系人选项ContactsContract.ContactStatusColumns联系人状态ContactsContract.PhoneLookupColumns手机号ContactsContract.GroupsColumns组定义ContactsContract.PresenceColumnsIM存在ContactsContract.SttingsColumns帐户设置ContactsContract.StatusColumns自己可见性Android 多媒体中的内容提供者以下的content provider比Android系统content provider重要,这些都是在表10-3所示。表10-3 Android MeidaStore Content Providers接口内容MediaStore.Audio.AlbumColumns专辑信息MediaStore.Audio.ArtistColums艺术家信息MediaStore.Audio.AudioColumns音频信息MediaStore.Audio.GenresColumns音频类型信息MediaStore.Audio.PlaylistsColumns音频播放列表信息MediaStore.Images.ImageColumns数字图像MediaStore.Video.VideoColumns数字视频MediaStore.MediaColumns通用媒体商店在本章的其余部分,我们将看看如何使用声明的内容提供者,访问它们,阅读它们,修改它们。定义一个内容提供者在一个可以使用的内容提供者里,它必须注册使用你的Android应用。是通过使用一些XML标记在AndroidManifest.xml文件做的。的标签,所以恰当的命名,允许我们定义我们的内容提供商要访问我们的应用程序启动。这里是一个为内容提供商:。所有的Android内容提供者可以在可公开访问的唯一的开发者参考地址访问,如果你允许的话,可以是每个数据库。这个地址就是一个URI,以及Android数据库内的表总是叫CONTENT_URL。内容提供者可以通过每个表一个独特的URI去访问多个表。这里有几个例子预定Android URI常量:Avider.Contacts.Phones.CONTENT_URLAvider.Contacts.Photos_ CONTENT_URLAndroid点表示操作系统,provider点表示控件的类型,Contacts点表示通讯录数据库,Phone点表示电话号码表,CONTENT_URI点表示内容的路径。就是这样的逻辑。注意:URI对象常被用作Android Content providers正如你在第八章看到使用Android Conten providers从content:/就像网址从http:/入口一样。在Eclipse创建一个内容提供者实例项目现在让我们创建一个Chapter 10 project的文件夹,因此这样你就可以学习一点更多关于Android清单编辑器和Eclipse如何自动化清单XML编码的过程对我们来说。1、如果你从以前的章节打开的Chapter9 的项目,右键文件夹选择关闭2、然后选择文件-new-项目和选择android项目去打开新的android新项目的对话框3、按照下面填写(如图10-2所示)项目名字:命名项目为Chapter10创建目标:设置android为1.5应用名字:命名应用为Android Content Providers包名:设置包名为viders创建Activity:勾选这个框然后命名activity为DatabaseExamples最小SDK版本:输入3,这是相配的最低的SDK版本图10-2 创建Chapter10项目定义安全的权限AndroidManifest.xml文件通常被简称您的应用的清单文件,它告诉我们,我们的应用程序就是Android OS。在最初的被访问的启动应用程序,设置应用程序的内存和任何系统资源或指针(地址启动的事情,我们要对话或连接)需要为应用程序成功运行。在这种情况下,这意味着我们将要求Android是否允许访问,并甚至可能改变(取决于我们添加的标签),Android的数据库之一就是前面的表格中列出的。如果我们需要在的某些领域去操作,我们需要获得权限使Android可以实现它以OS为基础一个稳定的安全级别。去定义权限,使用标签 。这个标签允许应用去读CONTACTS数据库,只读权限是固有的安全,所以我们只能查看和读取数据库,只读的操作对于数据库是非破坏性的。如果我们希望更改(重写或更新,或者添加)数据在数据库上,我们需要使用不同的权限标签去告诉android我们将要去写数据在android系统的数据库。在这种情况,WRITE_CONTACTS代表着我们将使用数据库使用的权限,正如你猜想的,写的标签如下:许可写入操作是有点多严重的事情,因为事实上,我们是现在可以搞砸了数据库。在这种情况下,我们正在处理的智能手机的用户联系人数据,我们可能会覆盖在那里我们的应用程序之前,曾经数据访问它。建议:这有不同的权限标签来控制进入android的服务和数据库部分。看一些它们的列表来获取android的一些常识让你可以学习关于智能手机的硬件,特色以及数据库。核查这个D/reference/android/Manifest.permissio n. html。 你将会为这些功能为之吃惊!现在让我们看看易于使用Eclipse添加必要的权限很容易。遵循这些步骤:1、右键点击AndroidManifest.xml文件在资源管理器导航窗格中,如图10-3所示,并选择Open或者敲F3在键盘上敲F3按钮。图10-3在Eclipse可视编辑器中为Chapter10清单文件中添加权限2、在第10章清单的选项卡,点击底部的“权限”选项卡的窗口(见图10-3).3、在右窗格点击添加按钮。4、选择使用权限条目在列表的底部,然后单击OK(见图10-4)。图10-4选择权限入口5、你在Permission窗格里面会看到用户权限,从下拉菜单看这些权限列表,选择android的权限,READ_CONTACTS(看图10-5)。然后这些会显示在窗体的左边。6、在右侧选择Uses Permisson权限类型应该更新窗口左,但目前并没有,所以我们(冗余,因为它已经在列表的底部)单击按钮强制清单编辑器用左窗格的适当的标签设置更新Uses Permisson。图10-5选择读内容的权限7、重复步骤3到步骤6添加另一个Uses Permisson标签,这个时候选择Uses Permisson的android.permission.WRITE_CONTACTS选项(见图10-6)。图10-6选择写内容的权限这是所有我们加入的读写权限。图10-7在清单文件结束标签外,最底部处给我们展示了这两条权限标签。建议:无论你什么时间想使用Eclipse的清单编辑器,你可以单击窗体下面的AndroidManifest.xm清单文件的标签,就是可以帮助你真实的看你所写的xml标记代码。图10-7 xml文件展示在可视编辑器上添加的权限现在我们有对联系人数据库有读写的权限,我们就可以对数据库进行操作了。在通讯录数据库中添加数据AndroidSQLite使用基于表的数据库模型,其中在每个固定格式中行代表每条数据记录和列表示的数据域。在这种方式中,每一条数据在每列中的数据是完全相同的类型或分类,每行是一种独特的这些类型的跨行数据收集。 在下面的例子中,我们将对表Contacts.People进行操作,在这个表中我们添加一些测试数据后,如表10-4所示。表10-4有测试数据的Contacts.People数据库接口计数姓名数量444Bil Gates2125551234134Steven Jobs4255556677534Larray Ellison2015554433274Mark Zuckerburg213-555-4567列标题是根据Android这一列相关数据命名的,这些都是你在Java代码中使用什么来访问数据的各个领域现在让我们在Android虚拟机中添加图10-4中的四条数据。(如果你喜欢,你可以添加不止这四条的数据),我们将使用这些功能让这些数据展示到智能手机上,步骤如下:1、选择Run As-Android Application运行虚拟机。注意:另一种选择窗口来开启虚拟机的方法,Android SDK和AVD Manager,选择你的1.5的虚拟机点击Start然后启动,你选择的每一个联系人此后都会被保存,即使你关闭了虚拟机。2、点击home按钮,你将会看到四个图标在你的主界面上(如图10-8),分别是信息,日期,联系人和浏览器。这个叫联系人的就是我们数据库的前端,会允许我们将为添加记录在表10-4所示。图10-8通讯录功能: 添加联系人到通讯录数据库3、点击联系人图标来启动通讯录数据库,初始时间为空。这个界面告诉我们还没有联系人,和怎么去添加新的联系人到通讯录里面。(正如右侧表0-8所示)4、点击菜单按钮,在屏幕的底部弹出菜单界面(和我们在第7章创建的菜单相似),在通信录数据库上可以提供四种不同选择。5、选择新的联系人选择可以弹出新的联系人的数据输入表格。6、在屏幕(如图10-9的左侧)的上方填写姓名(People.NAME)和手机号码(People.NUMBER),然后点击菜单按钮。7、选择Done选项,添加记录到数据库中,我们添加的信息出现在屏幕上(如图10-9右侧所示)。图10-9:在通讯录数据库中添加记录8、重复4-7步骤添加表10-4的另外三条的名字或者你添加其他的你自己的数据。数据库的操作让我们开始写作应用将访问联系人数据库。我们将做一些数据的查询,更新数据,添加数据,删除数据。查询内容提供者:查询内容首先,让我们在示例应用程序中的在Main.Xml文件中添加一个按钮的的,通过点击事件查询(正如第9章谈论的事件的处理或者之前章节谈论的),去连接我们的数据库。1、右键在/res/layout/文件夹main.xml文件,然后打开Eclipse的layout编辑器,然后正如之前的例子中通过拖拽添加按钮。这是一些代码来展示我们可以改变的Button和textView的属性。(如图10-10):图10-10在清单文件中添加Button代码2、接下来,选择src/viders/DatabaseExamples.java文件右键打开。3、第一步,一旦我们界面定下来时,我们添加Button对象的描述以及监听事件的代码,和之前章节一样,然后,我们写查询的方法。我们需要引入定义Button三条语句。Import android.widget.Button;Import android.view.View;Import android.view.View.OnClickListener;注意:记着使用导入语句使你的代码在类中可以生效。4、使用标准的代码,声明Button对象。Button queryButton =(Button)findVieById(R.id.queryButton);5、接下来,使用setOnClickListener()的方法来添加按钮的监听事件,使用下面划线的代码(如图10-11所示)。首先,给queryButton设置新的监听者,然后在监听方法写触发事件,我们在调用queryContactPhoneNumber()方法(如下的代码),当触发点击事件时。注意图10-11在Eclipse中划线的queryContactPhoneNumber()方法,告诉我们这个方法还没有结束。QueryButton.setOnClickListener(new OnClickListener()Public void onClick(View view)querryContactPhoneNumber(););图10-11在DatabaseExamples.java中声明import语句和查询按钮事件6、接下来,让我们添加我们需要的新的导入语句(如10-12所示)。图10-12java中queryContactPhoneNumber()和导入语句7、现在让我们写queryContactPhoneNumber()方法,去查询数据库(图10-12所示)。 Private void queryContactPhoneNumber()String cols = new String People.NAME,People.NUMBER;Uri myContacts = people.CONTENT_URI;Cursor mqCur = managedQuery(myContacts,cols,null,null,null); If(mqCur.moveToFirst()String myname =null;String mynumber = null;DoMyname =mqCur.getString(mqCur.getColumnIndex(People.NAME);MyNumber = mqCur.getString(mqCur.getColumenIndex(People.NUMBER);Toast.makeText(this,myname+” ”+mynumber,Toast.LENGTH_SHOAT).show()while(mqCur.moveToNext();让我们描述下我们写的query 方法,我们方法声明的是private(意味着是在类的内部去操作)和void,意味着是没有返回值。第一行定义一个叫cols的String数组对象,来存放Contact.People的表,叫做NAME和NUMBER。这有两种类型的数据是我们希望拿到的数据。Private void queryContactPhoneNumber()String cols = new StringPeople.NAME,People.NUMBER 接下来的叫做叫myContacts的Uri的对象,设置我们将会查询的People.CONTENT_URI表的地址。Uri myContacts =People.Content_URI;我们需要创建一个叫mqCur的Cursor对象,将managedQuery()的方法的值赋值给mqCur。这个方法使用myContacts uri对象,cols是我们的数据源,和其他三个null(它们代表着复杂的SQLite的参数)。Cursor mqCur = managedQuery(myContacts,cols,null,null,null);Cursor 对象将是我们managedQu()正确填充,我们将使用迭代代码,在一个声明的loop环里,遍历我们表的记录,让managedQuery()访问。把对象放置到if语句里面,通过moveToFirst()方法,当这种情况为真时,就会执行方法里面的内容。If(mqCur.moveToFirst())Myname和mynumber的String变量初始化微null,在它们就如dowhile循环体里面,循环体开始下面的结构与do包含三个逻辑编程的语句,结束与while()里面的方法,它的意思是,移动mqCur容器对象到下一行数据。只要有一个下一个记录,可以移动,这将等同于条件为真。当它不(最后一个记录结束的结果),它将等同于条件为假和跳出的循环,这将停止功能,正如我们的预期。换句话说,还有另一个记录的过程,我们要做一个循环体中运行的代码。 do while(mqCur.moveToNext());现在让我们看下在dowhile循环体三个要做的事情,这有一些要求要读下。首先我们设定myname变量,然后在当前数据结果中,选取People.NAME的结果赋值给myname(第一次的循环。就是第一条记录,第二次循环就是第二,等等)。 Myname =myCur.getString(mqCur.getColumnIndex(People.NAME);我们通过mqCur Cursor对象的两个方法: GetColumnIndex()方法是是将跟据 People.NAME的名称获得它的列索引的值。GetString()方法根据括号里面myname变量的值得到列值。我们重复这个过程,通过使用Person.NUMBER,它可以使一个字符串格式,甚至是一个数字或破折号。 Mynumber = mqCur.getString(mqCur.getColumnIndex(People.NMUBER);一旦我们把myname和mynumber的string变量加载上,就从数据库里面拿到数据,我们把就可以把这些数据显示到Toast控件上,注意这个版本的控件。图10-13 Android1.5虚拟机运行查询添加到内容提供者:添加新内容现在你将会学会怎么添加新内容到Content provider数据库,在这,我们会添加新的联系人和手机号码到通讯录数据库。1、首先,复制和粘贴第一个按钮标签到我们的清单文件里,然后更改下ID为addContButton。按钮的文字应该叫:“Click to add Contact to the Database”(如图10-14所示)。图10-14清单文件添加第二个按钮2、java编码的第一阶段在类里面,添加两个全局对象供所有方法使用。这有两个URIs代表一个我们添加的数据,另一个是改变的数据。Public class DatabaseExamples extends ActivityUri addUri = null;Uri changUri = null;3、接下来,我们添加第二个对象的声明和点击事件的代码,复制对象的声明和点击事件的代码添加到UI上的第二个按钮,在DatabaseExamples类中粘贴下面的代码在我们现有的界面上。4、更改按钮变量为addButton,和更改R.id对于我们的新按钮addContactButton很重要,同样,设置我们新的方法addContactPhoneNumber()方法(如图10-15所示),下面是新的代码。Button addButton =(Button)findVieById(R.id.queryButton);addButton.setOnClickListener(new OnClickListener() Overridepublic void onClick(View arg0) addContactPhoneNumber(“Steve Wozniak”,“415-555-7654“);注意:划线的代码叫做addContactPhoneNumber()和点击之后这条新的数据库信息就会添加到通讯录数据库中。图10-15在第二个按钮上添加java代码5、接下来我们即将添加新的方法addContactPhoneNumber()。Private void addContactPhoneNumber(Stirng newName,String newPhone)ContentValues myContact = new ContentValues();myContaxt.put(Person.NAME,newName);addUri = getContentResolver().insert(Person.CONTENT_URI,myContact);Uri contentUri = uri.withAppendedPath(addUri,People.Phones.CONTENT_DIERCTORY);myContact.clear();myContact.put(People.Phone.TYPE,People.TYPE_MOBILE);myContact.put(People.NUMBER,newPhone);changeUri = getContentResolver().insert(contentUri,myContact);Toast.makeText(this,”NewContact:”+newName+” ”+newPhone,Toast.LENGTH_SHORT); 我们要确定addContactPhoneNumber()这个私有的方法要有正确的参数,如下;Private void addContactPhoneNumber (String newName,String newPhone)这与queryContactPhoneNumber()方法有所不同,我们之前传的是明着和手机号作为参数,由于addContactPhoneNumber()方法依然没有返回值,所以仍然是void类型。现在我们可以编写代码,将添加一个新的名字和电话号码的联系人数据库。我们需要做的第一件事就是创建ContentValues对象叫做myContacts用来定义表、列和数据值,需要从Contnet provider里面传递过来。因为这是一个新的类,我们要在代码中使用,我们同样需要添加导入语句(如图10-16所示)。Import android.content.ContentValues;然后我们做完之后,我们要实例化ContentValues对象叫做myContact ,从下面的声明中。紧接着,我们需要配置键值对通过put方法。这种装有person表的ContentValues对象,列名(数据操作的名字)NAME,和名为newName的新String变量。myContact.put(Person.NAME,newName);接下来我们使用getContentResolver()方法插入myContact ContentValues对象到person表里面,就是我们之前章节谈论的指定位置有CONTENT_URI常数。addUri= etContentResolver().insert(People.CONTENT_URI,myContact);图10-16导入的语句声明两个全局变量Uri以及添加监听方法代码我们在最上方定义两个addUri和changeUri全局变量,就可以让这个类里面的任何方法使用了。我们也会在本章后面使用,这就是给它们定义成变量的目的。现在让我们右键Chapter10的文件夹,然后选择Run As- Android Application.然后当你点击第二个按钮时会看到,在我们代码里面的名字和手机号会被添加到通讯录数据库中,并在对话框中显示确认信息。正如图10-17所示。现在让我们进入设备查看这些数据。图10-17 在Android1.5的智能机虚拟机上添加联系人为了看到Steve Wozniak这条新数据,选择联系人图标,点击在手机屏幕最底部的菜单按钮,然后选择搜索功能,下拉你的列表直到看到Steve Wozniak进入。(图10-18右侧划线部分)。图10-18 在1.5的Android虚拟机上使用联系人功能现在你看到了在contact provider上怎么添加数据,让我们学习下怎么修改content provider数据。修改内容提供者数据:修改内容在数据库上使用写的权限更改已存在的数据很重要,因为新的数据需要被写入数据库中,下面就是重写已存在的数据。1、首先,在清单文件复制addContactButton按钮标签和粘贴到另一个按钮标签下面。修改modifyPhoneButton的id值。这就像我们现实生活中对一个存在的电话号码就行修改(人们一般更改电话号码的频率比改名字高)。2、接下来,更改按钮上的文字为“Click to Modify the Contact in the Database”。下面是在Eclipse编辑器上显示的清单文件的代码(图10-19所示)。 图10-19 在清单文件添加修改联系人按钮3、为这个新的数据库操作实现UI,让我们同样在DatabaseExamples.java文件中进行复制粘贴的操作。添加addButton按钮对象和addContactPhoneNumber()onClick()方法,然后更改成modButton按钮对象和监听方法,将modifyPhoneNumber()方法添加到监听方法里面(如图10-20所示).Button modButton =(Button)findViewById(R.id.modifyPhoneButton);modButton.setOnClickListener(new OnClickListener()public void onClick(View v)modifyPhoneNumber(“916-55-1234”);图10-20 在修改联系人按钮中添加java代码最重要的操作是在modifyPhoneNumber方法里面,这里面可以使我们添加新的手机号码。划线的代码是新电话号码取代已存在的号码(如图10-21)。我们也可以注意到图10-21中我们可以通过“+”来折叠住之前写的方法,这是Eclipse中的新功能,可以使我们更容易展示我们现在要写的代码,来扩展我们的联系人模块代码。下面展示的是截图上红色方块的代码。Private void modifuPhoneNumber(String replacePhone)If(changeUri=null)Toast.makeText(“Youneedto create a new to update!”,Toast.LENFTG_LONG).show();ElseContentValues newPhoneNumber = new ContentValues();newPhoneNumber.put(People.Phone.TYPE,People.TYPE.MOBULE);newPhoneNumber.put(People.NUMBER,replacePhone);getContentResolver().update(changeUri.newPhoneNumber,null,null);oast.makeText(“Updated phonr number to:”+ replacePhone”,Toast.LENFTG_LONG).show();图10-21 写modifyPhoneNumber方法代码modifyPhoneNumber方法使用了ifthenelse数据结构。首先,让我们判断changuri是否为空,通过(changeUri=null)这个条件判断。If(changeUir=null)Toast makeText(“You need to create a new contact to update”,Toast.LENFTG_LONG).show();如果这个条件符合,我们弹出这条信息,说我们还没有添加操作动作,建议我们去添加这个方法,通过修改可以添加新数据。如果(changeUri=null)条件不成立,我们需要添加我们去添加数据库中哪列的值,然后我们可以通过下面的代码继续执行数据库的修改,然后弹出一条信息告诉我们我们已经操作过数据库。getContentResolver().update(changeUri,newPhoneNumber,null,null);Toast.makeText(this,”Update phone number to:”)replacePhone, Toast.LENFTG_LONG).show();首先我们需要创建一个newPhoneNumber ContentValues对象,通过这个对象即一个代表这我们的数据库名称和常数,我们将使用引用的电话在联系人数据库数量字段。elseContentValues newPhoneNumber =new ContentValues();首先,我么需要给newPhoneNumber ContentValues传入数据库要修改的列名。第二行的代码,我们声明的People,Phone.TYPE和People.TYPE_MOBILE(也就是我们要更新的电话号码)。我们使用People.NUMBER数据库不断的通过回调modifyPhoneNumber()这个方法,传replacephone变量来更新数据。newPhoneNumber.put(People,Phone.TYPE, People.TYPE_MOBILE);newPhoneNumber.put(People,NUMBER, replacephone);在我们第四行的代码在else循环外面,我们调用getContenResolver().updatae()方法。getContenResolver().updatae(changeUri,newPhoneNumber,null,null);我们通过下面的对象:changeUri(我们再addContactPhoneNumber方法创建的),我们将要更新的最新的一条记录的位置。newPhoneNumber是ContentValues对象想修改的记录结构,也是将要更新的新电话号码。最后一旦我们getContentResolver().update()完成时,我们用Toast.makeText()用来展示数据。Toast.makeText(this,”updated phone number to:”+replacePhone, Toast.LENGTH_SHORT.show();编译并运行在Android1.5模拟器应用程序,你会看到我们的修改联系人的新按钮。如图10- 22所示。图10-22在1.5Android虚拟机上修改联系人我们可以查询数据库,添加信息,在已经存在的数据上修改电话号码,让我们完成数据库的基本操作:从provider databas

温馨提示

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

评论

0/150

提交评论