已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 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. 了解使用sqliteopenhelper对数据库进行版 本管理 9. 了解使用sqlitedatabase操作sqlite数据库 10. 了解使用事务操作sqlite数据库 11. 了解使用contentprovider共享数据 12. 了解uri 13. 了解contentprovider类的主要方法 14. 了解使用contentresolver操作contentprovider中的 数据 首先给大家介绍使用文件如何对数据进行存储,activity提供了openfileoutput()方法可 以用于把数据输出到文件中,具体的实现过程与在j2se环境中保存数据到文件中是一样 的。 【例5.1】用openfileoutput()方法把数据输出到文件中。 public 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()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如 果文件不存在,android 会自动创建它。创建的文件保存在/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 = 0 context.mode_append = 32768 context.mode_world_readable = 1 context.mode_world_writeable = 2 5.1 android5.1 android的文件的文件 使用文件进行数据存储 使用文件进行数据存储 context.mode_private:为默认操作模式,代表该文件是私有数据,只能被应用 本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加 到原文件中。可以使用context.mode_append context.mode_append:模式会检查文件是否存在,存在就往文件追加内容,否 则就创建新文件。 context.mode_world_readable和context.mode_world_writeable用 来控制其他应用是否有权限读写该文件。 mode_world_readable:表示当前文件可以被其他应用读取; mode_world_writeable:表示当前文件可以被其他应用写入。 如果希望文件被其他应用读和写,可以传入: openfileoutput(“lifoxsoftware.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 , 只有这样其他程序才能正确访问。 读取文件内容 如果要打开存放在/data/data/files目录应用私有的文件,可以 使用activity提供openfileinput()方法。 fileinputstream instream = this.getcontext().openfileinput(“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 = instream.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”为应用所在包,当 你在编写代码时应替换为你自己应用使用的包。 对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用 读和写,可以在创建文件时,指定 context.mode_world_readable和 context.mode_world_writeable权限。 activity还提供了getcachedir()和getfilesdir()方法: getcachedir()方法用于获取/data/data/cache目录 getfilesdir()方法用于获取/data/data/files目录 把文件存放在sdcard 使用activity的openfileoutput()方法保存文件,文件是存放在手机空间上, 一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大 文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在sdcard。 sdcard是干什么的?你可以把它看作是移动硬盘或u盘。 在模拟器中使用sdcard,你需要先创建一张sdcard卡(当然不是真的 sdcard,只是镜像文件)。创建sdcard可以在eclipse创建模拟器时随同创建 ,也可以使用dos命令进行创建,如下: 在dos窗口中进入android sdk安装路径的tools目录,输入以下命令创建一 张容量为2g的sdcard,文件后缀可以随便取,建议使用.img: mksdcard 2048m d:androidtoolsdcard.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.getexternalstoragedirectory();/获取sdcard目录 file savefile = new file(sdcarddir, “lifoxsoftware.txt”); fileoutputstream outstream = new fileoutputstream(savefile); outstream.write(“成都小狐狸软件播客 “.getbytes(); outstream.close(); environment.getexternalstoragestate()方法用于获取sdcard的状态,如果手机装有 sdcard,并且可以进行读写,那么方法返回的状态等于 environment.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 fileoutputstream(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 为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解析器,非常适合用于android等移动设备。 sax解析xml文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析 文档的过程中,sax会判断当前读到的字符是否合法xml语法中的某部分,如果符合就会触发事件 。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在contenthandler接口。 下面是一些contenthandler接口常用的方法: lstartdocument() 当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。 lenddocument() 和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。 lstartelement(string namespaceuri, string localname, string qname, attributes atts) 当读到一个开始标签的时候,会触发这个方法。namespaceuri就是命名空间,localname是 不带命名空间前缀的标签名,qname是带命名空间前缀的标签名。通过atts可以得到所有的属性名 和相应的值。要注意的是sax中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并 不会纪录下以前所碰到的标签,也就是说,在startelement()方法中,所有你所知道的信息,就是 标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的 信息,都是不得而知的,都需要你的程序来完成。这使得sax在编程处理上没有dom来得那么方 便。 lendelement(string uri, string localname, string name) 这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。 lcharacters(char ch, int start, int length) 这个方法用来处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数 是读到的字符串在这个数组中的起始位置和长度,使用new string(ch,start,length)就可以获取内 容。 【例5.6】使用 sax解析lifoxsoftware.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(“.“, “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“ characters(“.“, “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是一个接口,在使用的时候可能会有些不方便,因此, sax还为其制定了一个helper类:defaulthandler,它实现了contenthandler接口,但是其所有的方 法体都为空,在实现的时候,你只需要继承这个类,然后重写相应的方法即可。 【例5.7】使用sax解析lifoxsoftware.xml的代码如下: public static list readxml(inputstream instream) try saxparserfactory spf = saxparserfactory.newinstance(); saxparser saxparser = spf.newsaxparser(); /创建解析器 /设置解析器的相关特性,/sax/features/namespaces = true 表示开启命名空间特性 /saxparser.setproperty(“/sax/features/namespaces“,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的代码实现请 看下面。 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 extends defaulthandler private list persons = null; private person currentperson; private string tagname = null;/当前解析的元素标签 public list getpersons() return persons; /* * 接收文档开始的通知 */ override public void startdocument() throws saxexception persons = new arraylist(); /* * 接收字符数据的通知 */ override public void characters(char ch, int start, int length) throws saxexception if(tagname!=null) string data = new string(ch, start, length); if(tagname.equals(“name“) this.currentperson.setname(data); else if(tagname.equals(“age“) this.currentperson.setage(short.parseshort(data); /* * 接收元素开始的通知* 参数意义如下: * namespaceuri:元素的命名空间 localname:元素的本地名称(不带前缀) * qname:元素的限定名(带前缀) atts:元素的属性集合*/ override public void startelement(string namespaceuri, string localname, string qname, attributes atts) throws saxexception if(localname.equals(“person“) currentperson = new person(); currentperson.setid(integer.parseint(atts.getvalue(“id“); this.tagname = localname; /* 接收文档结尾的通知 * 参数意义如下:uri:元素的命名空间 localname:元素的本地名称(不带前缀) * name:元素的限定名(带前缀) */ override public void endelement(string uri, string localname, string name) throws saxexception if(localname.equals(“person“) persons.add(currentperson); currentperson = null; this.tagname = null; 使用dom读取xml文件 除了可以使用 sax解析xml文件,大家也可以使用 熟悉的dom来解析xml文件。 dom解析xml文件时,会 将xml文件的所有内容以对象树方式存放在内存中,然后 允许使用dom api遍历xml树、检索所需的数据。使用 dom操作xml的代码看起来比较直观,并且,在某些方 面比基于sax的实现更加简单。但是,因为dom需要将 xml文件的所有内容以对象树方式存放在内存中,所以内 存的消耗比较大,特别对于运行android的移动设备来说 ,因为设备的资源比较宝贵,所以建议还是采用sax来解 析xml文件,当然,如果xml文件的内容比较小采用 dom是可行的。 【例5.8】使用dom解析xml文件的代码。 import java.io.inputstream; import java.util.arraylist; import java.util.list; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.node; import org.w3c.dom.nodelist; import cn. lifoxsoftware.xml.domain.person; /* * 使用dom解析xml文件 * */ public class domxmlreader public static list readxml(inputstream instream) list persons = new arraylist(); documentbuilderfactory factory = documentbuilderfactory.newinstance(); try documentbuilder builder = factory.newdocumentbuilder(); document dom = builder.parse(instream); element root = dom.getdocumentelement(); nodelist items = root.getelementsbytagname(“person“);/查找所 有person节点 for (int i = 0; i public static list readxml(inputstreamreadxml(inputstream instreaminstream) ) xmlpullparserxmlpullparser parser = parser = xml.newpullparserxml.newpullparser();(); try try parser.setinput(instreamparser.setinput(instream, “utf-8“);, “utf-8“); intint eventtypeeventtype = = parser.geteventtypeparser.geteventtype();(); person person currentpersoncurrentperson = null; = null; list persons = null;list persons = null; while (while (eventtypeeventtype != != xmlpullparser.end_documentxmlpullparser.end_document) ) switch (switch (eventtypeeventtype) ) case case xmlpullparser.start_documentxmlpullparser.start_document:/:/文档开始事件文档开始事件, ,可可 以进行数据初始化处理以进行数据初始化处理 persons = new persons = new arraylistarraylist();(); break;break; case case xmlpullparser.start_tagxmlpullparser.start_tag:/:/开始元素事件开始元素事件 string name = string name = parser.getnameparser.getname();(); if (if (name.equalsignorecase(“personname.equalsignorecase(“person“) “) currentpersoncurrentperson = new person(); = new person(); currentperson.setid(newcurrentperson.setid(new integer(parser.getattributevalue(nullinteger(parser.getattributevalue(null, “id“);, “id“); else if (currentperson != null) if (name.equalsignorecase(“name“) currentperson.setname(parser.nexttext();/ 如果后面是text元素,即 返回它的值 else if (name.equalsignorecase(“age“) currentperson.setage(new short(parser.nexttext(); break; case xmlpullparser.end_tag:/结束元素事件 if (parser.getname().equalsignorecase(“person“) currentperson = null; break; eventtype = parser.next(); instream.close(); return persons; catch (exception e) e.printstacktrace(); return null; 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的qq,用户 可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通 常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进 行保存。如果是android应用,我们最适合采用什么方式保存软件配置参数呢?android平台 给我们提供了一个sharedpreferences类,它是一个轻量级的存储类,特别适合用于保存软件 配置参数。使用sharedpreferences保存数据,其背后是用xml文件存放数据,文件存放在 /data/data/shared_prefs目录下: sharedpreferences sharedpreferences = getsharedpreferences(“lifoxsoftware“, context.mode_private); editor editor = sharedpreferences.edit();/获取编辑器 editor.putstring(“name“, “成都小狐狸软件播客“); editor.putint(“age“, 4); mit();/提交修改 生成的lifoxsoftware.xml文件内容如下: 成都小狐狸软件播客 因为sharedpreferences背后是使用xml文件保存数据, getsharedpreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带 后缀,后缀会由android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模 式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望sharedpreferences 背后使用的xml文件能被其他应用读和写,可以指定context.mode_world_readable和 context.mode_world_writeable权限。 另外activity还提供了另一个getpreferences(mode)方法操作sharedpreferences,这 个方法默认使用当前类不带包名的类名作为文件的名称。 5.25.2使用使用sharedpreferencessharedpreferences进行数据存储进行数据存储 访问sharedpreferences中的数据 访问sharedpreferences中的数据代码如下: sharedpreferences sharedpreferences = getsharedpreferences(“lifoxsoftware“, 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.lifoxsoftware.action的应用使用下面语句创建了preference。 getsharedpreferences(“lifoxsoftware“, context.mode_world_readable); 其他应用要访问上面应用的preference,首先需要创建上面应用的context,然后通过context 访问 preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference 。 【例5.11】 context otherappscontext = createpackagecontext(“cn.lifoxsoftware.action“, context.context_ignore_security); sharedpreferences sharedpreferences = otherappscontext.getsharedpreferences(“lifoxsoftware“, context.mode_world_readable); string name = sharedpreferences.getstring(“name“, “); int age = sharedpreferences.getint(“age“, 0); 如果不通过创建context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用 preference对应的xml文件,如: file xmlfile = new file(“/data/data/shared_prefs/lifoxsoftware.xml”);/应替换成应用的包名 5.3使用嵌入式关系型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 排 序子句 l如:select * from person l select * from person order by id desc l select name from person group by name having count(*)1 l分页sql与mysql类似,下面sql语句获取5条记录,跳过前面3条记录 lselect * 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 使用sqliteopenhelper对数据库进行版本管理 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安 装在成百上千个用户的手机上,如果应用使用到了sqlite数据库,我们必须在用户初次使 用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时 候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件 时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软 件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的, 所以在android系统,为我们提供了一个名为sqliteopenhelper的抽象类,必须继承它才 能使用,它是通过对数据库版本进行管理来实现前面提出的需求。 为了实现对数据库版本进行管理,sqliteopenhelper类提供了两个重要的方法,分别 是oncreate(sqlitedatabase db)和onupgrade(sqlitedatabase db, int oldversion, int newversion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据 库表结构。当调用sqliteopenhelper的getwritabledatabase()或者 getreadabledatabase()方法获取用于操作数据库的sqlitedatabase实例的时候,如果数 据库不存在,android系统会自动生成一个数据库,接着调用oncreate()方法,oncreate() 方法在初次生成数据库时才会被调用,在oncreate()方法里可以生成数据库表结构及添加 一些应用使用到的初始化数据。onupgrade()方法在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在 的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时 希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置 为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 onupgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在 onupgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及 数据更新。 getwritabledatabase()和getreadabledatabase()方法都可以获取一个用于操作数据 库的sqlitedatabase实例。但getwritabledatabase() 方法以读写方式打开数据库,一旦 数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getwritabledatabase() 方法就会出错。getreadabledatabase()方法先以读写方式打开数据库,如果数据库的磁 盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 【例5.12】 databasehelper类代码。 public class databasehelper extends sqliteopenhelper /类没有实例化,是不能用作父类构造器的参数,必须声明为静态 private static final string name = “lifoxsoftware“; /数据库名称 private static final int version = 1; /数据库版本 public databasehelper(context context) /第三个参数cursorfactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表 使用系统默认的工厂类 super(context, name, null, version); override public void oncreate(sqlitedatabase db) db.execsql(“create table if not exists person (personid integer primary key autoincrement, name varchar(20), age integer)“); override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) db.execsql(“drop table if exists person“); oncreate(db); 上面onupgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然 后再重新创建。一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构 时,还要考虑用户存放于数据库中的数据不会丢失。 使用sqlitedatabase操作sqlite数据库 android提供了一个名为sqlitedatabase的类,该类封装了一些操作数据库的api,使 用该类可以完成对数据进行添加(create)、查询(retrieve)、更新(update)和删除(delete)操 作(这些操作简称为crud)。对sqlitedatabase的学习,我们应该重点掌握execsql()和 rawquery()方法。 execsql()方法可以执行insert、delete、update和create table之 类有更改行为的sql语句; rawquery()方法可以执行select语句。 execsql()方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年资阳辅警协警招聘考试备考题库附答案详解(模拟题)
- 2025年淮安辅警招聘考试真题及1套完整答案详解
- 2025年淮北辅警招聘考试真题附答案详解(突破训练)
- 2025年甘肃辅警协警招聘考试真题及答案详解(有一套)
- 2025年滨州辅警协警招聘考试真题及参考答案详解
- 2025年重庆辅警协警招聘考试真题附答案详解(满分必刷)
- 2025年阜阳辅警招聘考试题库及1套完整答案详解
- 2025年韶关辅警协警招聘考试真题及答案详解参考
- 2025年韶关辅警协警招聘考试真题含答案详解(达标题)
- (2025年)江西省宜春市【统招专升本】计算机真题(含答案)
- JJG 875-2019数字压力计
- 竖井施工方案
- 基于Robotstudio机器人上下料工作站设计
- 初中化学渗透“德育”教案
- 制梁场制存梁台座检测方案
- 质性研究方法PPT通用课件
- IATF-16949质量管理体系五大工具培训课件
- 中线的用法(倍长中线法)分析
- 劳动法学课程教学大纲
- 饮用纯净水(桶装)质量手册
- 交流接触器(课用)课件
评论
0/150
提交评论