Android的持久层开发.ppt
《Android的持久层开发.ppt》由会员分享,可在线阅读,更多相关《Android的持久层开发.ppt(46页珍藏版)》请在三一办公上搜索。
1、第 5 章 Android的持久层开发 内容提要:1 Android的文件 2 Android的SharedPreferences存储类 3 Android的SQLite数据库 4 Android的内容提供器(ContentProvider)组件,目的要求:1.了解文件数据的存储与读取 2.了解把文件存放在SDCard 3.了解使用SAX、DOM或pull解析XML文件 4.了解使用多线程下载文件 5.了解使用SharedPreferences进行数据存储 6.了解访问SharedPreferences中的数据 7.了解使用SQLite数据库存储数据 8.了解使用SQLiteOpenHelpe
2、r对数据库进行版本管理,9.了解使用SQLiteDatabase操作SQLite数据库 10.了解使用事务操作SQLite数据库 11.了解使用ContentProvider共享数据12.了解Uri 13.了解ContentProvider类的主要方法 14.了解使用ContentResolver操作ContentProvider中的数据,首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。【例5.1】用openFileOutput()方法把数据输出到文件中。p
3、ublic class FileActivity extends Activity Override public void onCreate(Bundle savedInstanceState).FileOutputStream outStream=this.openFileOutput(LiFoxSoftware.txt,Context.MODE_PRIVATE);outStream.write(成都小狐狸软件播客.getBytes();outStream.close();openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,Androi
4、d 会自动创建它。创建的文件保存在/data/data/files目录,如:/data/data/cn.LiFoxSoftware.action/files/LiFoxSoftware.txt,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/files目录就可以看到该文件。openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:Context.MODE_PRIVATE=0Context.M
5、ODE_APPEND=32768Context.MODE_WORLD_READABLE=1Context.MODE_WORLD_WRITEABLE=2,5.1 Android的文件使用文件进行数据存储,使用文件进行数据存储,Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。Context.MODE_WORLD_READ
6、ABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。如果希望文件被其他应用读和写,可以传入:openFileOutput(LiFoxSoftware.txt,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如
7、文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有这样其他程序才能正确访问。,读取文件内容,如果要打开存放在/data/data/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。FileInputStream inStream=this.getContext().openFileI
8、nput(LiFoxSoftware.txt);Log.i(FileTest,readInStream(inStream);readInStream()的方法请看本页下面例子。【例5.2】读取文件内容的readInStream()方法:public static String readInStream(FileInputStream inStream)try ByteArrayOutputStream outStream=new ByteArrayOutputStream();byte buffer=new byte1024;int length=-1;while(length=inStrea
9、m.read(buffer)!=-1)outStream.write(buffer,0,length);outStream.close();,读取文件内容,或者直接使用文件的绝对路径:File file=new File(/data/data/cn.LiFoxSoftware.action/files/LiFoxSoftware.txt);FileInputStream inStream=new FileInputStream(file);Log.i(FileTest,readInStream(inStream);注意:上面文件路径中的“cn.LiFoxSoftware.action”为应用所
10、在包,当你在编写代码时应替换为你自己应用使用的包。对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。Activity还提供了getCacheDir()和getFilesDir()方法:getCacheDir()方法用于获取/data/data/cache目录 getFilesDir()方法用于获取/data/data/files目录,把文件存放在SDCard,使用Activity的openFileOutput()方法保存文件,文件是存
11、放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。SDCard是干什么的?你可以把它看作是移动硬盘或U盘。在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:mksdcard 2048M D:An
12、droidToolsdcard.img 在程序中访问SDCard,你需要申请访问SDCard的权限。【例5.3】在AndroidManifest.xml中加入访问SDCard的权限如下:,把文件存放在SDCard,要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)File sdCardDir=Environment.get
13、ExternalStorageDirectory();/获取SDCard目录 File saveFile=new File(sdCardDir,“LiFoxSoftware.txt”);FileOutputStream outStream=new FileOutputStream(saveFile);outStream.write(成都小狐狸软件播客.getBytes();outStream.close();Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environm
14、ent.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:File sdCardDir=new File(/sdcard);/获取SDCard目录 File saveFile=new File(sdCardDir,LiFoxSoftware.txt);/上面两句代码可以合成一句:File saveFile=new File(/sdcard/LiFoxSoftware.txt);FileOutputStream outStream=new FileOutput
15、Stream(saveFile);outStream.write(成都小狐狸软件播客.getBytes();outStream.close();,使用SAX或者DOM或者pull解析XML文件,在Android平台上可以使用Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的pull解析器解析XML文件。下面是本例子要解析的XML文件:【例5.4】要解析的XML文件./文件名称:LiFoxSoftware.xml 李朝蓉 30 李朝莉 25 例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean
16、为Person,代码请见后面【例5.5】。,【例5.5】定义一个Person javabean用于存放解析出来的LiFoxSoftware.xml内容:public class Person private Integer id;private String name;private Short age;public Integer getId()return id;public void setId(Integer id)this.id=id;public String getName()return name;,使用SAX读取XML文件,SAX是一个解析速度快并且占用内存少的xml解析器,
17、非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。startEl
18、ement(String namespaceURI,String localName,String qName,Attributes atts)当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它
19、与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。endElement(String uri,String localName,String name)这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。characters(char ch,int start,int length)这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。,【例5.6】使用 SAX解析LiFoxSoft
20、ware.xml及其触发的事件:李朝蓉30李朝莉25解析LiFoxSoftware.xml触发的事件为:读到的标签及内容 触发事件 文档开始 startDocument()startElement(,persons,null,Attributes)nt characters(.,12,2)startElement(,person,null,Attributes)ntt characters(.,31,3)startElement(,name,null,Attributes)李朝蓉 characters(.,40,2)endElement(,name,null)ntt characters(.,
21、50,3)startElement(,age,null,Attributes),30 characters(.,58,2)endElement(,age,null)nt characters(.,67,2)endElement(,person,null)nt characters(.,79,2)startElement(,person,null,Attributes)ntt characters(.,98,3)startElement(,name,null,Attributes)李朝莉 characters(.,107,3)endElement(,name,null)ntt character
22、s(.,118,3)startElement(,age,null,Attributes)25 characters(.,126,2)endElement(,age,null)nt characters(.,135,2)endElement(,person,null)n characters(.,147,1)endElement(,persons,null)文档结束 endDocument(),使用SAX读取XML文件,只要为SAX提供实现ContentHandler接口的类,那么该类就可以得到通知事件(实际上就是SAX调用了该类中的回调方法)。因为ContentHandler是一个接口,在使用
23、的时候可能会有些不方便,因此,SAX还为其制定了一个Helper类:DefaultHandler,它实现了ContentHandler接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重写相应的方法即可。【例5.7】使用SAX解析LiFoxSoftware.xml的代码如下:public static List readXML(InputStream inStream)try SAXParserFactory spf=SAXParserFactory.newInstance();SAXParser saxParser=spf.newSAXParser();/创建解析器/设置
24、解析器的相关特性,http:/xml.org/sax/features/namespaces=true 表示开启命名空间特性/saxParser.setProperty(http:/xml.org/sax/features/namespaces,true);XMLContentHandler handler=new XMLContentHandler();saxParser.parse(inStream,handler);inStream.close();return handler.getPersons();catch(Exception e)e.printStackTrace();retu
25、rn null;SAX 支持已内置到JDK1.5中,你无需添加任何的jar文件。关于XMLContentHandler的代码实现请看下面。,import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import cn.LiFoxSoftware.xml.domain.Person;public class XMLContentHandler exte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 持久 开发
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2217122.html