黎活明老师android开发培训课件

上传人:yc****d 文档编号:243408487 上传时间:2024-09-22 格式:PPT 页数:98 大小:748KB
返回 下载 相关 举报
黎活明老师android开发培训课件_第1页
第1页 / 共98页
黎活明老师android开发培训课件_第2页
第2页 / 共98页
黎活明老师android开发培训课件_第3页
第3页 / 共98页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,高级软件人才实作培训专家,!,高级软件人才实作培训专家,!,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,3G,应用开发之,Android,1,什么是,3G,3G,,全称为,3rd Generation,,中文含义就是指第三代数字通信。,所谓,3G,,是指将无线通信与,国际互联网,等多媒体通信结合的新一代移动通信系统。,3G,只是一种通信技术标准,符合这个标准的技术有,WCDMA,、,CDMA2000,、,TD-SCDMA,三种制式。中国联通使用的是,WCDMA,(世界上大部分,3G,网络都采用的是该标准),;中国电信使用的是,CDMA2000,(日、韩和北美使用);中国移动使用的是具有自主知识产权的,TD-SCDMA(,只有中国才使用,),。相对第一代模拟制式手机,(1G),和第二代,GSM,、,CDMA,等数字手机,(2G),,,3G,网络能处理图像、音乐、视频等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。第三代与前两代的主要区别是在传输声音和数据的,速度上有很大的提升,。,由于,3G,商用需要相当浩大的工程,要从目前的,2G,迈向,3G,不可能一下就衔接得上,因此前几年,2.5G,的手机就出现了。符合,2.5G,标准的技术有,CDMA2000 1X,和,GPRS,,中国联通使用的是,CDMA2000 1X,标准,中国移动使用的是,GPRS,标准。目前,我们可以把,2.5G,移动通信技术看作是,2G,迈向,3G,的衔接性技术,在,2.5G,网络下出现了如,WAP,、蓝牙,(Bluetoot),等技术。,2,智能手机软件平台,智能手机软件平台有:,Symbian, Windows Mobile, RIM BlackBerry, Android, iPhone, Palm, Brew, Java/J2ME,。,2009,年市场份额,:,Symbian 51%,RIM BlackBerry 18%,iPhone 13.3,windows Mobile 9.3%,linux 4.6%,Android 1.8%,3,什么是,Android,Android,一词的本义指“机器人”,,Android,是,Google,于,07,年,11,月,5,日宣布的基于,Linux,平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成。在国内,联想、戴尔、多普达、飞利浦、中兴、三星、摩托罗拉、等厂商已经推出基于,Android,平台的智能手机。,在,3G,应用开发领域,,Android,的发展前景不容小视,也将会成为未来主流的手机操作系统。,4,如何安装,Android SDK,和,Eclipse,插件,所需开发环境,:,JDK 5,或,JDK 6 (,仅有,JRE,不够,),Eclipse 3.5 (galileo),下载,ADT,的,Eclipse,插件,安装,Eclipse,插件,(ADT),启动,Eclipse,,选择,Help Install New Software,,在出现的对话框里,点击,Add,按钮,在对话框的,name,一栏输入,“ADT”,,然后点击,Archive.,,浏览和选择已经下载的,ADT,插件,压缩文件。,点击,OK.。,返回可用软件的视图,你会看到这个插件,,,然后选择,Developer Tools (,会选中下面的,“Android Developer Tools”,和,“Android Editors“),,点击,Next,,最后重启,Eclipse,。,下载,Android SDK,:,下载完,SDK,后,把,.zip,文件解压到你电脑上合适位置。启动,Eclipse,,选择,window-preferences,,在打开的视图左边点击,android,,在右边的,SDK Location,中选择,Android SDK,所在位置。,5,开发第一个,Android,应用,打开,Eclipse,,新建项目,(,点击,File,NewProject,),,在项目列表中展开,Android,目录,选择,Android Project,,如下图:,6,开发第一个,Android,应用,7,开发第一个,Android,应用,点击,”finish”,即可完成项目的创建,创建后的项目已经是一个可运行的,Android,应用,我们可以通过下面方式运行此应用:,点击工具栏上手机形状的虚拟设备管理器,(,简称,“AVD“),,如下:,8,开发第一个,Android,应用,在打开的虚拟设备管理器中创建一个虚拟手机:,9,开发第一个,Android,应用,在项目上右键点击,run as,Android application,,如下图,:,10,Android,应用程序架构,src/,java,原代码存放目录,gen/,自动生成目录,gen,目录中存放所有由,Android,开发工具自动生成的文件。目录中最重要的就是,R.java,文件。 这个文件由,Android,开发工具自动产生的。,Android,开发工具会自动根据你放入,res,目录的,xml,界面文件、图标与常量,同步更新修改,R.java,文件。正因为,R.java,文件是由开发工具自动生成的,所以我们应避免手工修改,R.java,。,R.java,在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的,id,,通过,R.java,,应用可以很方便地找到对应资源。另外编绎器也会检查,R.java,列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。,res,/,资源,(Resource),目录,在这个目录中我们可以存放应用使用到的各种资源,如,xml,界面文件,图片或数据。具体请看,ppt,下方备注栏。,AndroidManifest.xml,功能清单文件,这个文件列出了应用程序所提供的功能,在这个文件中,你可以指定应用程序使用到的服务,(,如电话服务、互联网服务、短信服务、,GPS,服务等等,),。另外当你新添加一个,Activity,的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此,Activity,。,default.properties,项目环境信息,,一般是不需要修改此文件,11,电话拔号器,效果图,:,12,电话拔号器,因为应用要使用手机的电话服务,所以要在清单文件,AndroidManifest.xml,中添加电话服务权限,:,略,.,13,电话拔号器,界面布局,:,LinearLayout (,线性布局,),、,AbsoluteLayout(,绝对布局,),、,RelativeLayout(,相对布局,),、,TableLayout(,表格布局,),、,FrameLayout(,帧布局,),14,电话拔号器,Activity:,public class DialerAction extends Activity ,Override,public void onCreate(Bundle savedInstanceState) ,super.onCreate(savedInstanceState);,setContentView(R.layout.main);,Button button = (Button)findViewById(R.id.button);,button.setOnClickListener(new View.OnClickListener(),public void onClick(View v) ,EditText editText = (EditText)findViewById(R.id.mobile);,Intent intent = new Intent(,Intent.ACTION_CALL, Uri.parse(tel:+ editText.getText();,DialerAction.this.startActivity(intent);,);,15,电话拔号器,测试步骤,:,1,在,Eclipse,中运行此应用,2,在,Dos,窗口中进入,android SDK,安装路径的,tools,目录,输入以下命令再开启一个,Android,模拟器,:,emulator -data itcast,注:,itcast,为用户数据存取文件,,,如果该文件不存在,,,默认在,tools,目录创建该文件,3,在电话扰号器中输入上图现显的电话号码,16,短信发送器,效果图,:,17,短信发送器,因为应用要使用手机的短信服务,所以要在清单文件,AndroidManifest.xml,中添加短信服务权限,:,略,.,18,短信发送器,界面布局,:,19,短信发送器,Activity,主要代码,:,String mobile = mobileView.getText().toString();,String content = contentView.getText().toString();,SmsManager smsManager = SmsManager.getDefault();,PendingIntent sentIntent = PendingIntent.getBroadcast(SMSSender.this, 0, new Intent(), 0);,if(content.length()70)/,如果字数超过,70,需拆分成多条短信发送,List msgs = smsManager.divideMessage(content);,for(String msg : msgs),smsManager.sendTextMessage(mobile, null, msg, sentIntent, null);,/,最后二个参数为短信已发送的广播意图,最后一个参数为短信对方已收到短信的广播意图,else,smsManager.sendTextMessage(mobile, null, content, sentIntent, null);,Toast.makeText(SMSSender.this, ,短信发送完成, Toast.LENGTH_LONG).show();,20,短信发送器,测试步骤,:,1,在,Eclipse,中运行此应用,2,在,Dos,窗口中进入,android SDK,安装路径的,tools,目录,输入以下命令再开启一个,Android,模拟器,:,emulator -data itcast,注:,itcast,为用户数据存取文件,,,如果该文件不存在,默认在,tools,目录创建该文件,3,在短信发送器的手机号中输入上图现显的电话号码,注:目前,Android,系统对中文短信尚未支持,所以发送中文短信会有乱码,这个问题日后会被解决的。,21,数据存储与访问,很多时候我们的软件需要对处理后的数据进行存储或再次访问。,Android,为数据存储提供了多种方式,分别有如下几种:,文件,SharedPreferences,SQLite,数据库,内容提供者(,Content provider,),网络,22,使用文件进行数据存储,首先给大家介绍使用文件如何对数据进行存储,,Activity,提供了,open(),方法可以用于把数据输出到文件中,具体的实现过程与在,J2SE,环境中保存数据到文件中是一样的。,public class extends Activity ,Override public void onCreate(Bundle savedInstanceState) ,.,outStream = this.open(itcast.txt, Context.MODE_PRIVATE);,outStream.write(,传智播客,.getBytes();,outStream.close();,open(),方法的第一参数用于指定文件名称,不能包含路径分隔符“,/”,,如果文件不存在,,Android,会自动创建它。创建的文件保存在,/data/data/files,目录,如,:,/data/data/cn.itcast.action/,,通过点击,Eclipse,菜单“,Window”-“Show View”-“Other”,,在对话窗口中展开,android,文件夹,选择下面的视图,然后在视图中展开,/data/data/files,目录就可以看到该文件。,open(),方法的第二参数用于指定操作模式,有四种模式,分别为:,Context.MODE_PRIVATE,= 0,Context.MODE_APPEND,= 32768,Context.MODE_WORLD_READABLE = 1,Context.MODE_WORLD_WRITEABLE = 2,23,使用文件进行数据存储,Context.MODE_PRIVATE,:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用,Context.MODE_APPEND,Context.MODE_APPEND,:,模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。,Context.MODE_WORLD_READABLE,和,Context.MODE_WORLD_WRITEABLE,用来控制其他应用是否有权限读写该文件。,MODE_WORLD_READABLE,:,表示当前文件可以被其他应用读取;,MODE_WORLD_WRITEABLE,:,表示当前文件可以被其他应用写入。,如果希望文件被其他应用读和写,可以传入:,open(itcast.txt,Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE,);,android,有一套自己的安全模型,当应用程序,(.apk),在安装时系统就会分配给他一个,userid,,当该应用要去访问其他资源比如文件的时候,就需要,userid,匹配。默认情况下,任何应用创建的文件,,sharedpreferences,,数据库都应该是私有的(位于,/data/data/files,),其他程序无法访问。除非在创建时指定了,Context.MODE_WORLD_READABLE,或者,Context.MODE_WORLD_WRITEABLE,,只有这样其他程序才能正确访问。,24,读取文件内容,如果要打开存放在,/data/data/files,目录应用私有的文件,可以使用,Activity,提供,open(),方法。,inStream = this.getContext().open(itcast.txt);,Log.i(, readInStream(inStream);,readInStream(),的方法请看本页下面备注。,或者直接使用文件的绝对路径:,= new File(/data/data/,cn.itcast.action,/);,inStream = new (file);,Log.i(, readInStream(inStream);,注意:上面文件路径中的,“cn.itcast.action”,为应用所在包,当你在编写代码时应替换为你自己应用使用的包。,对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定,Context.MODE_WORLD_READABLE,和,Context.MODE_WORLD_WRITEABLE,权限。,Activity,还提供了,getCacheDir(),和,get(),方法:,getCacheDir(),方法用于获取,/data/data/cache,目录,get(),方法用于获取,/data/data/files,目录,25,把文件存放在,SDCard,使用,Activity,的,open(),方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在,SDCard,。,SDCard,是干什么的?你可以把它看作是移动硬盘或,U,盘。,在模拟器中使用,SDCard,,你需要先创建一张,SDCard,卡(当然不是真的,SDCard,,只是镜像文件)。创建,SDCard,可以在,Eclipse,创建模拟器时随同创建,也可以使用,DOS,命令进行创建,如下:,在,Dos,窗口中进入,android SDK,安装路径的,tools,目录,,,输入以下命令创建一张容量为,2G,的,SDCard,,文件后缀可以随便取,建议使用,.img,:,mksdcard,2048M,D:AndroidToolsdcard.img,在程序中访问,SDCard,,你需要申请访问,SDCard,的权限。,在,AndroidManifest.xml,中加入访问,SDCard,的权限如下,:,26,把文件存放在,SDCard,要往,SDCard,存放文件,程序必须先判断手机是否装有,SDCard,,并且可以进行读写。,注意:访问,SDCard,必须在,AndroidManifest.xml,中加入访问,SDCard,的权限,if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED),= Environment.getExternalStorageDirectory();,/,获取,SDCard,目录,= new , “itcast.txt”);,outStream = new (saveFile);,outStream.write(,传智播客,.getBytes();,outStream.close();,Environment.getExternalStorageState(),方法用于获取,SDCard,的状态,如果手机装有,SDCard,,并且可以进行读写,那么方法返回的状态等于,Environment.MEDIA_MOUNTED,。,Environment.getExternalStorageDirectory(),方法用于获取,SDCard,的目录,当然要获取,SDCard,的目录,你也可以这样写:,= new File(/sdcard);,/,获取,SDCard,目录,= new , itcast.txt);,/,上面两句代码可以合成一句:,= new File(/sdcard/itcast.txt);,outStream = new (saveFile);,outStream.write(,传智播客,test.getBytes();,outStream.close();,27,使用,SAX,或者,DOM,或者,pull,读取,XML,文件,在,Android,平台上可以使用,Simple API for XML(SAX),、,Document Object Model(DOM),和,Android,附带的,pull,解析器解析,XML,文件。,下面是本例子要解析的,XML,文件:,文件名称:,itcast.xml,李明,30,李向梅,25,例子定义了一个,javabean,用于存放上面解析出来的,xml,内容,,这个,javabean,为,Person,,代码请见本页下面备注:,28,使用,SAX,读取,XML,文件,SAX,是一个解析速度快并且占用内存少的,xml,解析器,非常适合用于,Android,等移动设备。,SAX,解析,XML,文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,,SAX,会判断当前读到的字符是否合法,XML,语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(,callback,)方法,这些方法,(,事件,),定义在,ContentHandler,接口。下面是一些,ContentHandler,接口常用的方法:,startDocument(),当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。,endDocument(),和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。,startElement(String namespaceURI, String localName, String qName, Attributes atts),当读到一个开始标签的时候,会触发这个方法。,namespaceURI,就是命名空间,,localName,是不带命名空间前缀的标签名,,qName,是带命名空间前缀的标签名。通过,atts,可以得到所有的属性名和相应的值。要注意的是,SAX,中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在,startElement(),方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得,SAX,在编程处理上没有,DOM,来得那么方便。,endElement(String uri, String localName, String name),这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。,characters(char ch, int start, int length),这个方法用来处理在,XML,文件中读到的内容,第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用,new String(ch,start,length),就可以获取内容。,29,使用,SAX,读取,XML,文件,只要为,SAX,提供实现,ContentHandler,接口的类,那么该类就可以得到通知事件(实际上就是,SAX,调用了该类中的回调方法)。因为,ContentHandler,是一个接口,在使用的时候可能会有些不方便,因此,,SAX,还为其制定了一个,Helper,类:,DefaultHandler,,它实现了这个接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重载相应的方法即可。使用,SAX,解析,itcast.xml,的代码如下:,public static List readXML(InputStream inStream) ,try ,SAXParserFactory spf = SAXParserFactory.newInstance();,SAXParser saxParser = spf.newSAXParser();,/,创建解析器,/,设置解析器的相关特性,,= true,表示开启命名空间特性,saxParser.setProperty(,true);,XMLContentHandler handler = new XMLContentHandler();,saxParser.parse(inStream, handler);,inStream.close();,return handler.getPersons();, catch (Exception e) ,e.printStackTrace();,return null;,SAX,支持已内置到,JDK1.5,中,你无需添加任何的,jar,文件。关于,XMLContentHandler,的代码实现请看本页下面备注。,30,使用,DOM,读取,XML,文件,除了可以使用,SAX,解析,XML,文件,,,大家也可以使用熟悉的,DOM,来解析,XML,文件。,DOM,解析,XML,文件时,会将,XML,文件的所有内容读取到内存中,然后允许您使用,DOM API,遍历,XML,树、检索所需的数据。使用,DOM,操作,XML,的代码看起来比较直观,并且,在某些方面比基于,SAX,的实现更加简单。但是,因为,DOM,需要将,XML,文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行,Android,的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用,SAX,来解析,XML,文件,当然,如果,XML,文件的内容比较小采用,DOM,是可行的。,代码请看本页下方备注,31,使用,Pull,解析器读取,XML,文件,除了可以使用,SAX,和,DOM,解析,XML,文件,,,大家也可以使用,Android,内置的,Pull,解析器解析,XML,文件。,Pull,解析器的运行方式与,SAX,解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用,parser.next(),可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个,switch,对感兴趣的事件进行处理。当元素开始解析时,调用,parser.nextText(),方法可以获取下一个,Text,类型元素的值。,使用,Pull,解析器读取,itcast.xml,的代码在本页下方备注,Pull,解析器的源码及文档下载网址:,32,使用,Pull,解析器生成,XML,文件,有些时候,,,我们需要生成一个,XML,文件,生成,XML,文件的方法有很多,如:可以只使用一个,StringBuilder,组拼,XML,内容,然后把内容写入到文件中;或者使用,DOM API,生成,XML,文件,或者也可以使用,pull,解析器生成,XML,文件,这里推荐大家使用,Pull,解析器。,使用,Pull,解析器生成一个与,itcast.xml,文件内容相同的,myitcast.xml,文件,代码在本页下方备注,使用代码如下(生成,XML,文件):,= new File(myitcast.xml);,outStream = new (xmlFile);,OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, UTF-8);,BufferedWriter writer = new BufferedWriter(outStreamWriter);,writeXML(persons, writer);,writer.flush();,writer.close();,如果只想得到生成的,xml,内容,可以使用,StringWriter,:,StringWriter writer = new StringWriter();,writeXML(persons, writer);,String content = writer.toString();,33,使用,SharedPreferences,进行数据存储,很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的,QQ,,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是,window,软件通常我们会采用,ini,文件进行保存,如果是,j2se,应用,我们会采用,properties,属性文件进行保存。如果是,Android,应用,我们最适合采用什么方式保存软件配置参数呢?,Android,平台给我们提供了一个,SharedPreferences,类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用,SharedPreferences,保存数据,其背后是用,xml,文件存放数据,文件存放在,/data/data/shared_prefs,目录下:,SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);,Editor editor = sharedPreferences.edit();/,获取编辑器,editor.putString(name, ,传智播客,);,editor.putInt(age, 4);,mit();/,提交修改,生成的,itcast.xml,文件内容如下:,传智播客,因为,SharedPreferences,背后是使用,xml,文件保存数据,,getSharedPreferences(name,mode),方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由,Android,自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望,SharedPreferences,背后使用的,xml,文件能被其他应用读和写,可以指定,Context.MODE_WORLD_READABLE,和,Context.MODE_WORLD_WRITEABLE,权限。,另外,Activity,还提供了另一个,getPreferences(mode),方法操作,SharedPreferences,,这个方法默认使用当前类不带包名的类名作为文件的名称。,34,访问,SharedPreferences,中的数据,访问,SharedPreferences,中的数据代码如下:,SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);,/getString(),第二个参数为缺省值,如果,preference,中不存在该,key,,将返回缺省值,String name = sharedPreferences.getString(name, );,int age = sharedPreferences.getInt(age, 1);,如果访问其他应用中的,Preference,,前提条件是:该,preference,创建时指定了,Context.MODE_WORLD_READABLE,或者,Context.MODE_WORLD_WRITEABLE,权限。如:有个,为,cn.itcast.action,的应用使用下面语句创建了,preference,。,getSharedPreferences(itcast, Context.,MODE_WORLD_READABLE);,其他应用要访问上面应用的,preference,,,首先需要创建上面应用的,Context,,然后通过,Context,访问,preference,,访问,preference,时会在应用所在包下的,shared_prefs,目录找到,preference,:,Context otherAppsContext = createPackageContext(cn.itcast.action, Context.,CONTEXT_IGNORE_SECURITY,);,SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences(itcast, Context.MODE_WORLD_READABLE);,String name = sharedPreferences.getString(name, );,int age = sharedPreferences.getInt(age, 0);,如果不通过创建,Context,访问其他应用的,preference,,可以以读取,xml,文件方式直接访问其他应用,preference,对应的,xml,文件,如:,= new File(“/data/data/shared_prefs/itcast.xml”);/,应替换成应用的包名,35,使用嵌入式关系型,SQLite,数据库存储数据,除了可以使用文件或,SharedPreferences,存储数据,还可以选择使用,SQLite,数据库存储数据。,在,Android,平台上,集成了一个嵌入式关系型数据库,SQLite,SQLite3,支持,NULL,、,INTEGER,、,REAL(,浮点数字,),、,TEXT(,字符串文本,),和,BLOB(,二进制对象,),数据类型,虽然它支持的类型虽然只有五种,但实际上,sqlite3,也接受,varchar(n),、,char(n),、,decimal(p,s),等数据类型,只不过在运算或保存时会转成对应的五种数据类型。,SQLite,最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如,:,可以在,Integer,字段中存放字符串,,,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为,INTEGER PRIMARY KEY,的字段只能存储,64,位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。 另外,,SQLite,在解析,CREATE TABLE,语句时,会忽略,CREATE TABLE,语句中跟在字段名后面的数据类型信息,如下面语句会忽略,name,字段的类型信息:,CREATE TABLE person (personid integer primary key autoincrement, name varchar(20),SQLite,可以解析大部分标准,SQL,语句,,,如:,查询语句:,select * from,表名,where,条件子句,group by,分组字句,having . order by,排序子句,如:,select * from person,select * from person order by id desc,select name from person group by name having count(*)1,分页,SQL,与,mysql,类似,下面,SQL,语句获取,5,条记录,跳过前面,3,条记录,select * from Account limit 5 offset 3,或者,select * from Account limit 3,5,插入语句:,insert into,表名,(,字段列表,) values(,值列表,)。,如:,insert into person(name, age) values(,传智,3),更新语句:,update,表名,set,字段名,=,值,where,条件子句。,如:,update person set name=,传智, where id=10,删除语句:,delete from,表名,where,条件子句。,如:,delete from person where id=10,36,使用,SQLiteDatabase,操作,SQLite,数据库,Android,提供了一个名为,SQLiteDatabase,的类,该类封装了一些操作数据库的,API,,使用该类可以完成对数据进行添加,(Create),、查询,(Retrieve),、更新,(Update),和删除,(Delete),操作(这些操作简称为,CRUD,)。对,SQLiteDatabase,的学习,我们应该重点掌握,execSQL(),和,rawQuery(),方法。,execSQL(),方法可以执行,insert、delete,、,update,和,CREATE TABLE,之类有更改行为的,SQL,语句;,rawQuery(),方法可以执行,select,语句。,execSQL(),方法的使用例子:,SQLiteDatabase db = .;,db.execSQL(insert into person(name, age) values(,传智播客, 4);,db.close();,执行上面,SQL,语句会往,person,表中添加进一条记录,在实际应用中,,语句中的“传智播客”这些参数值应该由用户输入界面提供,如果把用户输入的内容原样组拼到上面的,insert,语句, 当用户输入的内容含有单引号时,组拼出来的,SQL,语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“,&,”这些特殊,SQL,符号,为保证组拼好的,SQL,语句语法正确,必须对,SQL,语句中的这些特殊,SQL,符号都进行转义,显然,对每条,SQL,语句都做这样的处理工作是比较烦琐的。,SQLiteDatabase,类提供了一个重载后的,execSQL(String sql, Object bindArgs),方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数,(?),。使用例子如下:,SQLiteDatabase db = .;,db.execSQL(insert into person(name, age) values(?,?), new Object,传智播客, 4);,db.close();,execSQL(String sql, Object bindArgs),方法的第一个参数为,SQL,语句,第二个参数为,SQL,语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。,37,使用,SQLiteDatabase,操作,SQLite,数据库,SQLiteDatabase,的,rawQuery(),用于执行,select,语句,使用例子如下:,SQLiteDatabase db = .;,Cursor cursor = db.rawQuery(“select * from person”, null);,while (cursor.moveToNext() ,int personid = cursor.getInt(0);,/,获取第一列的值,第一列的索引从,0,开始,String name = cursor.getString(1);,/,获取第二列的值,int age = cursor.getInt(2);,/,获取第三列的值,cursor.close();,db.close();,rawQuery(),方法的第一个参数为,select,语句;第二个参数为,select,语句中占位符参数的值,如果,select,语句没有使用占位符,该参数可以设置为,null,。带占位符参数的,select,语句使用例子如下:,Cursor cursor = db.rawQuery(select * from person where name like ? and age=?, new String%,传智,%, 4);,Cursor,是结果集游标,用于对结果集进行随机访问,如果大家熟悉,jdbc,,其实,Cursor,与,JDBC,中的,ResultSet,作用很相似。使用,moveToNext(),方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为,false,,否则为,true,。另外,Cursor,还有常用的,moveToPrevious(),方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为,false,,否则为,true,)、,moveToFirst(),方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为,false,,否则为,true,)和,moveToLast(),方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为,false,,否则为,true,) 。,38,使用,SQLiteDatabase,操作,SQLite,数据库,除了前面给大家介绍的,execSQL(),和,rawQuery(),方法,,SQLiteDatabase,还专门提供了对应于添加,、,删除,、,更新,、,查询的操作方法:,insert(),、,delete(),、,update(),和,query(),。这些方法实际上是给那些不太了解,SQL,语法的菜鸟使用的,对于熟悉,SQL,语法的程序员而言,直接使用,execSQL(),和,rawQuery(),方法执行,SQL,语句就能完成数据的添加,、,删除,、,更新,、,查询操作。,Insert(),方法用于添加数据,,各个字段的数据使用,ContentValues,进行存放。,ContentValues,类似于,MAP,,相对于,MAP,,它提供了存取数据对应的,put(String key, Xxx value),和,getAsXxx(String key),方法,,key,为字段名称,,value,为字段值,,Xxx,指的是各种常用的数据类型,如:,String,、,Integer,等。,SQLiteDatabase db = databaseHelper.getWritableDatabase();,ContentValues values = new ContentValues();,values.put(name, ,传智播客,);,values.put(age, 4);,long rowid = db.insert(“person”, null, values);,/,返回新添记录的行号,与主键,id,无关,不管第三个参数是否包含数据,执行,Insert(),方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为,Null,的记录。,Insert(),方法内部实际上通过构造,insert,语句完成数据的添加,,Insert(),方法的第二个参数用于指定空值字段的名称,相信大家对此参数会感到疑惑,此参数的作用是干嘛的?是这样的:如果第三个参数,values,为,Null,或者元素个数为,0, Insert(),方法必然要添加一条除了主键之外其它字段为,Null,值的记录,为了满足这条,insert,语句的语法,,insert,语句必须给定一个字段名,如:,insert into person(,name,) values(,NULL,),,倘若不给定字段名 ,,insert,语句就成了这样:,insert into person() values(),,显然这不满足标准,SQL,的语法。对于字段名,建议使用主键之外的字段,如果使用了,INTEGER,类型的主键字段,执行类似,insert into person(
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!