




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数。onCreate()函数在数据库第一次建立时被调用,一般用来创建数据库中的表,并完成初始化工作。在代码第11行中,通过调用SQLiteDatabase实例的execSQL()方法,执行创建表的SQL命令。onUpgrade()函数在数据库需要升级时被调用,一般用来删除旧的数据库表,并将数据库转移到新的版本的数据库表中。在代码的16行和17行中,为了简单起见,并没有做任何数据转移,而仅仅删除原有的表后建立新的数据表。程序开发人员不应直接调用onCreate()和onUpgrade()函数,而应由SQLiteOpenHelper类来决定何时调用这两个函数。SQLiteOpenHelper类的getWritableDatebase()函数getReadableDatabase()函数是可以直接调用的函数。getWritableDatebase()函数用来建立或打开可读写的数据库实例,一旦函数调用成功,数据库实例将被缓存,在需要使用数据库实例时就可以调用这个方法获取数据库实例,务必在不使用时调用close()函数关闭数据库。如果保存数据库文件的磁盘空间已满,调用getWritableDatebase()函数则无法获得可读写的数据库实例,这是可以调用getReadableDatabase()函数,获得一个只读的数据库实例。当然,如果程序开发人员不希望使用SQLiteOpenHelper类,也可以直接使用SQL命令建立数据库。首先调用openOrCreateDatabase函数创建数据库实例,然后调用execSQL()函数执行SQL命令,完成数据库和数据表的建立过程,其示例代码如下。1 private static final String DB-CREATE=create table+2 DB-CREATE+(KEY-ID+integer primary key autoincremant, +3 KEY-NAME+text not null,+KEY-AGE+integer, +KEY=HEIGHT+float);4 public void creat() 5 db.openOrcreateDatabase(DB-NAME,context.MODE-PRIVATE,null)6 db.execSQL(DB-CREATE);7 8.3.4数据操作 数据操作指的是对数据的添加、删除、查找和更新操作,虽然程序开发人员完全可以通过执行SQL命令名完成数据操作,但这里任然推荐使用Android提供的专用类和方法,这些类和方法的使用更加简洁、方便。 为了使DBAdapter类支持数据添加、删除、更新和查找等新功能,在DBAdapter类中增加下面的函数。其中,insert(People people)用来添加一条数据,queryAllData()用来获取全部数据,queryOneData(long id)根据id获取一条数据,deleteAllData()用来删除全部数据,deleteOneData(long id) 根据id删除一条数据,updateOneData (long id, People people)根据id更新一条数据。1 public class DBAdapter2 public long insert(People people) 3public long deleteAllData()4 public long deleteOneData(long id)5 public peoplequeryAllData()6 public peoplequeryOneData(long id)7 public long updateOneData (long id, People people) 89 private peopleConvertoPeople (Cursor cursor) 10 ConvertoPeople (Cursor cursor)是私有函数,作用是将查询结果转换为自定义的People类实例。People类包含4个公共属性,分别为ID、Name、Age和Height,对应数据库中的4个属性值。重载toString()函数,主要是便于界面显示的需要。People的代码如下。1 public class People2 public int ID= -1;3 public Sting Name;4 public int Age;5 public floate Height;67 Override8 Public Sting toString() 9 Sting result=;10 result+=ID:+this.ID+,;11 result+=姓名:this. Name+,;12 result+=年龄:+ this. Age+,;13 result+=身高:+ this. Height+,;14 return result;15 16 SQLiteDatabase类的公有函数insert()、delete()、updata()、query(),封装了执行添加、删除、更新、和查询功能的SQL命令。下面分别介绍如何使用SQLiteDatabase类的公有函数,完成数据的添加、删除、更新、和查询等操作。1.添加功能为了添加一条新数据,首先构造一个ContentValues实例,然后调用ContentValues实例的put()方法,将每个属性的值写入到ContentValues实例中,最后使用SQLiteDatabase实例的insert()函数,将ContentValues实例中的数据写入到指定的数据表中。insert()函数的返回值时新数据插入的位置,即ID值。ContentValues类时一个数据承载容器,主要用来向数据库表中添加一条数据。1 public long insert(People people) 2ContentValues newValues = new ContentValues();34newValues.put(KEY_NAME, people.Name);5newValues.put(KEY_AGE, people.Age);6newValues.put(KEY_HEIGHT, people.Height);78return db.insert(DB_TABLE, null, newValues);9 第4行代码向ContentValues实例newValues中添加一个名称/值对,put()函数的第1个参数是名称,第2个参数是值在第8行代码的insert()函数中,第1个参数是数据表的名称,第2个参数是替换数据,当第三个参数中的数据位空时使用;第3个参数是需要向数据库表中添加的数据。2.删除功能删除数据比较简单,只需要调用当前数据库实例的delete()函数,并指明表名称和删除条件即可。1 public long deleteAllData() 2return db.delete(DB_TABLE, null, null);3 45 public long deleteOneData(long id) 6return db.delete(DB_TABLE, KEY_ID + = + id, null);7 delete()函数的第1个参数是数据表名称,第2个参数是删除条件在第2行代码中,删除条件为null,表示删除表中的所有数据代码第6行则指明需要删除数据的id值,因此deleteOneData()函数仅删除一条数据,此时delete()函数的返回值表示被删除的数据数量。3.更新功能更新数据同样要使用ContentValues实例,首先构造ContentValues实例,然后调用put()函数将属性值写入到ContentValues实例中,最后使用SQLiteDatabase的update()函数,并指定数据的更新条件。1 public long updateOneData(long id , People people)2ContentValues updateValues = new ContentValues(); 3updateValues.put(KEY_NAME, people.Name);4updateValues.put(KEY_AGE, people.Age);5updateValues.put(KEY_HEIGHT, people.Height);67return db.update(DB_TABLE, updateValues, KEY_ID + = + id, null);8 在代码的第7行中,update()函数的第1个参数表示数据表的名称,第2个参数是更新条件。update()函数的返回值表示数据库表中被更新的数据数量。4.查询功能介绍查询功能前,先要介绍一下Cursor类在Android系统中,数据库查询结果的返回值并不是数据集合的完整拷贝,而是返回数据集的指针,这个指针就是Cursor类。Cursor类支持在查询结果的数据集合中以多种方式移动,并能够获取数据集合的属性名称和序号,具体的方法和说明可以参考下表8.5。 表8.5Cursor类的公有方法从Cursor中提取数据可以参考ConvertToPeople()函数的实现方法。在提取Cursor数据中的数据前,推荐测试Cursor中的数据数量,避免在数据获取中产生异常,例如下面代码的第3行到第5行。从Cursor中提取数据使用类型安全的get()函数,函数的参数是属性的序号,为了获取属性的序号,可以使用getColumnIndex()函数获取指定属性的序号。1 private People ConvertToPeople(Cursor cursor)2int resultCounts = cursor.getCount();3if (resultCounts = 0 | !cursor.moveToFirst()4return null;56People peoples = new PeopleresultCounts;7for (int i = 0 ; iresultCounts; i+)8 peoplesi = new People();9 peoplesi.ID = cursor.getInt(0);10 peoplesi.Name = cursor.getString(cursor.getColumnIndex(KEY_NAME);11 peoplesi.Age = cursor.getInt(cursor.getColumnIndex(KEY_AGE);12 peoplesi.Height = cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT);13 cursor.moveToNext();1415return peoples;16 要进行数据查询就需要调用SQLiteDatabase类的query()函数,这个函数的参数较多,可以参考表8.6的参数说明,query()函数的语法如下。 表8.6 query()函数的参数说明下面分别给出根据id查询数据和查询全部数据的代码。1 public People getOneData(long id) 2Cursor results = db.query(DB_TABLE, new String KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT, KEY_ID + = + id, null, null, null, null);3return ConvertToPeople(results);4 1 public People getAllData() 2Cursor results = db.query(DB_TABLE, new String KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT, null, null, null, null, null);3return ConvertToPeople(results);4 SQLiteDemo是对SQLite数据库进行操作的示例,在这个示例中,用户可以在界面的上方输入数据信息,通过“添加数据”按钮将数据写入数据库。“全部显示”相当于查询数据库中的所有数据,并将数据显示在界面下方。“清除显示”仅是清除界面下面显示数据,而不对数据库进行任何操作。“全部删除”是数据库操作,将删除数据库中的所有数据。在界面中部,以“ID+功能”命名的按钮,分别是根据ID删除数据、查询数据和更新数据,而这个ID值就取自本行的EditText控件。 图 8.12 SQLiteDemo用户界面8.4数据共享 Android应用程序运行在不同的进程空间中,因此不同应用程序的数据是不能够直接访问的为了增强程序之间的数据共享能力,Android系统提供了像SharedPreferences这类类简单的跨越程序边界的访问方法,但这些方法都存在一定的局限性 。ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法,可以指定需要共享的数据,而其它应用程序则则可在不知道数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。8.4.1 ContentProvider 在Android系统中,许多Android系统内置的数据也是通过ContentProvider提供给用户使用,例如通讯录、音视频文件和图像文件等。在创建ContentProvider前,首先要实现底层的数据源,数据源包括数据库、文件系统或网络等,然后继承ContentProvider类中实现基本数据操作的接口函数,包括添加、删除、查找和更新等功能。调用者不能直接调用ContentProvider的接口函数,而需要使用ContentResolver对象,通过URI间接调用ContentProvider,调用关系如下图所示。 图 8.13 ContentProvider调用关系 在ContentResolver对象与ContentProvider进行交互时,通过URI确定要访问的ContentProvider数据集。在发起一个请求的过程中,Android系统根据URI确定处理这个查询的ContentProvider,然后初始化ContentProvider所有需要的资源,这个初始化的工作是Android系统完成的,无需程序开发人员参与。一般情况下只有一个ContentProvider对象,但却可以同时与多个ContentResolver进行交互。 ContentProvider完全屏蔽了数据提供组件的数据存储方法在程序开发人员看来,数据提供者通过ContentProvider提供了一组标准的数据操作接口,但却无需知道数据提供者的内部数据的存储方法。数据提供者可以使用SQLite数据库存储数据,也可以通过文件系统或SharedPreferences存储数据,甚至是使用网络存储的方法,这些数据的存储方法和存储设备对数据使用者都是不可见的。同时,也正是这种屏蔽模式,很大程度上简化的ContentProvider的使用方法,使用者只要调用ContentProvider提供的接口函数,即可完成所有的数据操作,而数据存储方法则是ContentProvider设计者需要考虑的问题。 Content
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师招聘之《小学教师招聘》押题模拟及完整答案详解【考点梳理】
- 白莲河水库加固工程施工组织设计方案
- 教师招聘之《小学教师招聘》强化训练题型汇编及答案详解(典优)
- 智能楼宇与设施管理创新创业项目商业计划书
- 教师招聘之《小学教师招聘》考前冲刺练习题含答案详解(能力提升)
- 2025内蒙古鄂尔多斯东胜区第五小学分校塔拉壕小学招聘1人笔试备考附答案详解(突破训练)
- 2025年教师招聘之《幼儿教师招聘》练习题库包及参考答案详解(新)
- 2025年教师招聘之《幼儿教师招聘》模拟试题及一套答案详解
- 教师招聘之《小学教师招聘》强化训练题型汇编含完整答案详解【全优】
- 考点攻克公务员考试《常识》同步练习练习题(含答案详解)
- 白酒生产安全员考试题库及答案解析
- 2025店面劳动合同范本:超市收银员专项协议
- 《树之歌》课件 小学部编版语文二年级上册
- 展会联合承办协议书范本
- 2025-2026冀人版三年级科学上册教学设计(附目录)
- 2025设备担保抵押借款合同
- 早教托育合伙人合同协议
- 轮胎印痕分析与运用课件
- 库房温湿度记录表
- 10KV电力安全工器具试验报告
- (精选word)英语四线格(a4打印)
评论
0/150
提交评论