Android 重量级数据存储之SQLite

前言

不知不觉的Android基础系列已经写了十三篇了,这是第十四篇~上一篇blog记录了Android中的一种数据存储方案,即共享参数(Sharedpreferences)的使用(处女男学Android(十三)—Android 轻量级数据存储之SharedPreferences)。最近初学如何在Android中应用SQLite,写了一个基于ListView的增删查的小例子,本篇blog就记录一下我学习到的如何在Android中操作SQLite持久化客户端数据。

初始化SQLite

关于SQLite的基础知识本篇就不做介绍了,我们只需知道它也是一个关系型的轻量级数据库,并且是嵌入式的数据库引擎,较适用于移动设备的数据存储,详情可参考百科:?url=_RNKz-r1FBwEm4iVvyxLQzCuKRdR12RrHNtUUa2nhSpILvUyT3g8jxVMbQzWmRHAUaRPYBem04hwMyom3kVx0a

本节记录初始化,那无非就是建库和建表了,下面先看这样一段初始化代码:

package com.wl.cigrec.dao;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final String DB_NAME = "mycigrec.db";// 数据库版本private static final int VERSION = 1;public DBHelper(Context context) {super(context, DB_NAME, null, VERSION);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubString sql1 = "create table t_order("+ "id integer primary key autoincrement," + "count integer ,"+ "money real,date date,balance real,orderid varchar(20))";String sql2 = "create table t_order_detail("+ "id integer primary key autoincrement,"+ "cigname varchar(20),cigprice real,cigcount integer,orderid varchar(20))";db.execSQL(sql1);db.execSQL(sql2);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("——onUpgrade called——" + "oldVersion–>"+ oldVersion + "," + "newVersion–>" + newVersion);}}这就是初始化数据库的代码了,完全参考官方文档中的示例代码,下面逐行解释一下重点内容。

Line 7定义了一个DB帮助类并且继承了SQLiteOpenHelper类,这个类是Android提供的管理数据库的工具类,封装了很多便捷操作DB的方法,实际开发中我们一般都会选择去扩展SQLiteOpenHelper去初始化我们自己的DB,所以我这里就无视了那些基础的API方法,尽管SQLiteOpenHelper的底层依旧是使用那些基础API。

Line 15调用了父类的带有4个参数的构造方法,看一下文档中的解释:

context参数不必多说,用于打开或创建数据库。name参数是数据库文件的文件名。factory参数用于创建cursor对象,一般默认为NULL。最后一个version参数是我们人为指定的数据库版本号,规定从1开始,否则会抛异常,可以参考源码的第100行:

if (version < 1) throw new IllegalArgumentException("Version must be >= 1, was " + version);

Line 20 初始化数据库时会回调onCreat(SQLiteDatabase db)方法,一般我们会在onCreat方法中创建数据表。

Line 33 当数据库版本变更时回调该方法,比如升级软件时需要更新表结构,那我们就会在这个方法中写一些alter table的语句去执行,其实个人认为这个方法略显鸡肋,我更倾向于重新创建数据库文件。

以上就是我们的初始化工作了,完成了建库和建表,那么接下来就是如何使用DML语言去操作DB了。

操作SQLite

上一小节完成了数据库初始化,接下来就是通过SQL语句去执行更新或查询了,在Android中操作SQLite首先需要做的是打开DB,我们有两个方法可供选择,分别是:

getReadableDatabase()、getWritableDatabase()

先读一下官方文档中对getWritableDatabase()的解释~翻译仅供参考~

Create and/or open a database that will be used for reading and writing. The first time this is called, the database will be opened and onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and/or onOpen(SQLiteDatabase) will be called.(创建或打开一个可读写的数据库,,第一次调用之后,数据库将会被打开,并且onCreate方法、onUpgrade方法或者onOpen方法也会被调用)

Once opened successfully, the database is cached, so you can call this method every time you need to write to the database. (Make sure to call close() when you no longer need the database.) Errors such as bad permissions or a full disk may cause this method to fail, but future attempts may succeed if the problem is fixed(一旦成功打开数据库,那么数据库将会被缓存,所以每次当你需要给数据库写入数据的时候你可以调用这个方法,当不再需要使用数据库的时候务必调用close()方法来关闭数据库,一些错误可能虎会引起这个方法调用失败,比如:错误的权限、硬盘已满,但是如果错误被修复了那么随后的尝试可能会成功)

看了getWritableDatabase()的说明之后,再看看getReadableDatabase()的说明,然后才好作比较~

其实,每个人都是幸福的。只是,你的幸福,常常在别人眼里。

Android 重量级数据存储之SQLite

相关文章:

你感兴趣的文章:

标签云: