在Android中最为常用的存储方式是SQLite存储,这是一个轻量级的嵌入式数据库。SQLite是Android系统自带的一个标准数据库,支持经典的SQL语句。SQLite遵守ACID关联式数据库管理系统,是为嵌入式系统所设计的产品,并且目前已经在很多嵌入式产品中使用。SQLite的突出优点是占用非常低的资源。在嵌入式设备中,可能只需要几百KB的内存即可。SQLite能够支持Windows、Linux、UNIX等主流的操作系统,同时能够跟很多程序语言结合使用,例如C#、PHP和Java等。并且还支持ODBC接口,另外和MySQL、PostgreSQL这两款开源数据库管理系统相比,SQLite的处理速度更快。
注意:ACID是指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
在接下来的内容中,将通过一个具体实例来讲解使用SQLite存储的方法。
实例文件UserSQLite.java的具体实现流程如下。
(1)定义类DatabaseHelper,此类承于类SQLiteOpenHelper,具体代码如下。
在上述代码中,首先分别重写了方法onCreate()和onUpgrade();然后在方法onCreate()中构造了一条SQL语句,并且通过db.execSQL(sql)执行了这条SQL语句。这条SQL语句的功能是生成了一张数据库表。
类SQLiteOpenHelper是一个辅助类,功能是生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()时,如果当时没有数据,那么Android系统就会自动生成一个数据库。
类SQLiteOpenHelper是一个抽象类,在Android应用项目中通常需要继承这个类。在类SQLiteOpenHelper的实现中包含了如下3个方法。
□方法onCreate(SQLiteDatabase):在第一次生成数据库时会调用这个方法,一般我们会在这个方法中生成数据库表。
□方法onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统
会主动的调用这个方法。一般我们在这个方法中删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。
□方法onOpen(SQLiteDatabase):这是当打开数据库时的回调方法,一般不会用到。
(2)编写按钮处理事件,单击“插入两条记录”按钮后,如果数据成功插入到数据库中的diary表中,那么在界面的title区域就会显示插入成功提示信息,如图2-7所示。
图2-7 插入成功
如果单击“添加两条数据”按钮,会执行监听器里的onClick()方法,并最终执行了上述程序里的insertItem()方法,具体代码如下。
在上述代码中,sql1和sql2是构造的两条标准的SQL语句,如果读者对SQL语句不是很熟悉,可以参考相关的书籍。鉴于本书的重点是Android,所以对SQL语句的知识不进行详细介绍。Log.i()的功能是将参数内容打印到日志中,并且打印级别是Info级别;db.execSQL(sql1)表示执行SQL语句。
Android支持5种打印输出级别,分别是Verbose、Debug、Info、Warning、Error,在应用程序中最常用的是Info级别,即将一些自己需要知道的信息打印出来,如图2-8所示。
图2-8 打印输出级别
(3)单击“查询数据库”按钮,在屏幕界面的标题(title)区域会显示当前数据表中数据的条数。因为刚才我们插入了两条数据,所以现在单击“查询数据库”按钮后会显示为两条记录的提示,如图2-9所示。
图2-9 查询数据
单击“查询数据库”按钮后会执行监听器里的onClick()方法,并最终执行了上述程序里的方法showItems(),具体代码如下。
在上述代码中,语句“Cursor cur=db.query(TABLE_NAME,col,null,null,null,null,null)”的功能是,将查询到的数据放到一个Cursor当中。在这个Cursor里封装了数据表TABLE_NAME中的所有条列。
方法query()的功能是查询数据,包含了如下7个参数。
□第1个参数:是数据库中表的名字,比如在这个例子中,表的名字就是TABLE_NAME,也就是“diary”。
□第2个参数:是我们想要返回数据包含的列的信息。在这个例子当中我们想要得到的列有title、body,我们把这两个列的名字放到字符串数组中。
□第3个参数:selection,相当于SQL语句的where部分,如果想返回所有的数据,那么就直接置为null。
□第4个参数:selectionArgs,在selection部分有可能用到“?”,那么在selectionArgs定义的字符串会代替selection中的“?”。(www.xing528.com)
□第5个参数:groupBy,定义查询出来的数据是否分组,如果为null则说明不用分组。
□第6个参数:having,相当于SQL语句当中的having部分。
□第7个参数:orderBy,用于描述我们期望的返回值是否需要排序,如果设置为null
则说明不需要排序。
注意:Cursor在Android当中是一个非常有用的接口,通过Cursor我们可以对从数据库查询出来的结果集进行随机的读写访问。
(4)单击“删除一条数据”按钮后,如果成功删除会在屏幕的title区域看到文字提示,如图2-10所示。
现在再次单击“查询数据库”按钮,会发现数据库中的记录少了一条,如图2-11所示。
当单击“删除一条数据”按钮,程序会执行监听器中的onClick方法,并最终执行了上述程序里的deleteItem()方法,其实现代码如下。
图2-10 删除一条数据
图2-11 查询数据
在上述代码中,通过“db.delete(TABLE_NAME,"title='haiyang'",null)”语句删除了一条title为“AA”的数据。如果有很多条title为“AA”的数据,则会全部删除。方法delete()中各个参数的具体说明如下。
□第1个参数:表示数据库表名,在这里是TABLE_NAME,也就是diary。
□第2个参数:相当于SQL语句当中的where部分,也就是描述了删除的条件。
如果在第2个参数当中有“?”,那么第3个参数中的字符串会依次替换在第2个参数当中出现的“?”。
(5)单击“删除数据表”按钮后可以删除表diary,如图2-12所示。
图2-12 删除表
单击“删除数据表”按钮后会执行方法dropTable(),具体代码如下。
在上述代码中,构造了一个标准的删除数据表的SQL语句,然后执行语句db.execSQL(sql)。
(6)此时如果单击其他按钮可能会出现运行异常,如果单击“新建数据表”按钮,执行效果如图2-13所示。
图2-13 新建表
此时再单击“查询数据库”按钮可以查看里边是否有数据存在,如图2-14所示。
图2-14 显示0条记录
单击“新建数据表”按钮后会执行方法CreateTable(),此方法的功能是重新建立数据表。具体代码如下。
在上述代码中,sql变量表示使用的是标准的SQL语句,功能是按要求建立一张新表。“db.execSQL("DROP TABLE IF EXISTS diary")”表示如果存在表diary则先将其删除,因为在同一个数据库中不能出现两张同名字的表;“db.execSQL(sql)”用于执行SQL语句,这条SQL语句的功能是建立一个新表。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。