|
|
|
|
移动端

3.2.3 SQLite 存储

《Android游戏开发从入门到精通》第3章Android 游戏开发基础,本章将引导读者开始Android 手机游戏开发,详细讲解Android 游戏开发的基本知识,为读者进行本书后面知识的学习打下基础。本节为大家介绍SQLite 存储。

作者:王玉芹来源:机械工业出版社|2017-11-14 11:06

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

3.2.3 SQLite 存储

在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,具体代码如下。

  1. private static class DatabaseHelper extends SQLiteOpenHelper {  
  2. DatabaseHelper(Context context) {  
  3. super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  4. }  
  5. @Override  
  6. public void onCreate(SQLiteDatabase db) {  
  7. String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE  
  8. + " text not null, " + BODY + " text not null " + ");";  
  9. Log.i("haiyang:createDB=", sql);  
  10. db.execSQL(sql);  
  11. }  
  12. @Override  
  13. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  14. }  

在上述代码中,首先分别重写了方法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 区域就会成功显示。如图3-3 所示。

如果单击“添加两条数据”按钮,会执行监听器里的onClick()方法,并最终执行了上述程序里的insertItem()方法,具体代码如下。

  1. /*插入两条数据*/  
  2. private void insertItem() {  
  3. /*得到一个可写的SQLite 数据库,如果这个数据库还没有建立  
  4. 那么mOpenHelper 辅助类负责建立这个数据库。  
  5. 如果数据库已经建立,那么直接返回一个可写的数据库。*/  
  6. SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
  7. String sql1 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY  
  8. + ") values('AA', 'android 好');";  
  9. String sql2 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY  
  10. + ") values('BB', 'android 好');";  
  11. try {  
  12. Log.i("haiyang:sql1=", sql1);  
  13. Log.i("haiyang:sql2=", sql2);  
  14. db.execSQL(sql1);  
  15. db.execSQL(sql2);  
  16. setTitle("插入成功");  
  17. } catch (SQLException e) {  
  18. setTitle("插入失败");  
  19. }  

在上述代码中,sql1 和sql2 是构造的两条标准SQL 语句,如果读者对SQL 语句不是很熟悉,可以参考相关的书籍。鉴于本书的重点是Android,所以对SQL 语句的知识不进行详细介绍。Log.i()的功能是将参数内容打印到日志中,并且打印级别是Info 级别;db.execSQL(sql1)表示执行SQL 语句。

Android 支持5 种打印输出级别,分别是Verbose、Debug、Info、Warning、Error,在应用程序中最常用的是Info 级别,即将一些自己需要知道的信息打印出来。如图3-4 所示。

(3)单击“查询数据库”按钮,在屏幕界面的title 区域会显示当前数据表中数据的条数。因为前面插入了两条数据,所以现在单击“查询数据库”按钮后会显示为两条记录的提示。如图3-5 所示。

单击“查询数据库”按钮后会执行监听器里的onClick()方法,并最终执行了上述程序里的方法showItems(),具体代码如下。

  1. /*在屏幕的title 区域显示当前数据表当中的数据的条数*/  
  2. private void showItems() {  
  3. //得到一个可写的数据库  
  4. SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
  5. String col[] = { TITLE, BODY };  
  6. Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null);  
  7. //通过getCount()方法,可以得到Cursor 当中数据的个数  
  8. Integer num = cur.getCount();  
  9. setTitle(Integer.toString(num) + " 条记录");  
  10. }  

在上述代码中,语句“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 中的“?”。

第5 个参数:groupBy,定义查询出来的数据是否分组,如果为null 则说明不用分组。

第6 个参数:having,相当于SQL 语句当中的having 部分。

第7 个参数:orderBy,用于描述我们期望的返回值是否需要排序,如果设置为null则说明不需要排序。

注意:Cursor 在Android 当中是一个非常有用的接口,通过Cursor 可以对从数据库查询出来的结果集进行随机的读写访问。

(4)单击“删除一条数据”按钮后,如果成功删除会在屏幕的标题(title)区域看到文字提示。如图3-6 所示。

现在再次单击“查询数据库”按钮,会发现数据库中的记录少了一条。如图3-7 所示。当单击“删除一条数据”按钮,程序会执行监听器中的onClick 方法,并最终执行了上述程序里的deleteItem()方法,其实现代码如下。

  1. /*删除其中的一条数据*/  
  2. private void deleteItem() {  
  3. try {  
  4. SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
  5. db.delete(TABLE_NAME, " title = 'AA'", null);  
  6. setTitle("删除了一条title 为AA 的一条记录");  
  7. } catch (SQLException e) {  
  8. }  

在上述代码中,通过“db.delete(TABLE_NAME, " title = 'haiyang'", null)”语句删除了一条title 为“AA”的数据。如果有很多条title 为“AA”的数据,则会全部删除。方法delete()中各个参数的具体说明如下。

第一个参数:表示数据库表名,在这里是TABLE_NAME,也就是diary。

第二个参数:相当于SQL 语句当中的where 部分,也就是描述了删除的条件。如果在第二个参数当中有“?”,那么第三个参数中的字符串会依次替换在第二个参数当中出现的“?”。

(5)单击“删除数据表”按钮后可以删除表diary,如图3-8 所示。

单击“删除数据表”按钮后会执行方法dropTable(),具体代码如下。

  1. /*删除数据表*/  
  2. private void dropTable() {  
  3. SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
  4. String sql = "drop table " + TABLE_NAME;  
  5. try {  
  6. db.execSQL(sql);  
  7. setTitle("删除成功:" + sql);  
  8. } catch (SQLException e) {  
  9. setTitle("删除错误");  
  10. }  

在上述代码中, 构造了一个标准的删除数据表的SQL 语句, 然后执行语句db.execSQL(sql)。

(6)此时如果单击其他按钮可能会出现运行异常,如果单击“新建数据表”按钮,执行效果如图3-9 所示。

此时再单击“查询数据库”按钮可以查看里边是否有数据存在,如图3-10 所示。单击“新建数据表”按钮后会执行方法CreateTable(),此方法的功能是重新建立数据表。具体代码如下。

  1. /*重新建立数据表*/  
  2. private void CreateTable() {  
  3. SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
  4. String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE  
  5. + " text not null, " + BODY + " text not null " + ");";  
  6. Log.i("haiyang:createDB=", sql);  
  7. try {  
  8. db.execSQL("DROP TABLE IF EXISTS diary");  
  9. db.execSQL(sql);  
  10. setTitle("重建数据表成功");  
  11. } catch (SQLException e) {  
  12. setTitle("重建数据表错误");  
  13. }  

在上述代码中,sql 变量表示使用的是标准的SQL 语句,功能是按要求建立一张新表。“db.execSQL("DROP TABLE IF EXISTS diary")”表示如果存在表diary 则先将其删除,因为在同一个数据库中不能出现两张同名字的表;“db.execSQL(sql)”语句用于执行SQL 语句,这条SQL 语句的功能是建立一个新表。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

计算机网络安全

本书从计算机网络安全的概念入手,分析了单机节点、单一网络、互联网络和开放互联网络的基本安全问题,并对计算机网络安全体系架构和安全机...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊