内容来源:高成珍、钟元生《Android编程经典案例解析》
SQLite 数据库是Android 中内嵌的轻量级关系型数据库,本质上只是一个文件。SQLite 内部只支持NULL,INTEGER, REAL,TEXT 和BLOB 这五种数据类型,在SQLite 中可以把各种类型的数据保存到任何字段中而不用关心字段声明的数据类型是什么,例如可以把字符串类型的值存入INTEGER类型的字段中。因此在编写建表语句时可以省略数据列后面的类型声明。但有一种情况例外,定义为INTEGER PRIMARY KEY 的字段只能存储64位整数,当向这种字段保存整数以外的数据时会产生错误。
常见的SQL标准语句如下:
1. 查询:
select * from 表名 where 条件子句 group by 分组子句 having ...order by 排序子句
例如:
select name from person group by name having count(*) > 1
查询person 表中name 字段值出现超过1次的name 字段的值
2. 分页:
select * from 表名 limit 跳过的记录数, 显示的记录数
例如:
select * from person limit 3, 5
从person 表中获取5条记录,跳过前面三条记录
3. 插入:
insert into 表名(字段列表) values(值列表)
例如:
insert into person(name, age) values(‘张三’, 20)
向person表中插入一条记录,名字为小明,年龄为20岁
4. 更新:
update 表名 set 字段名=值 where 条件子句
例如:
update person set name=‘李四’ where id=10
将ID为10的记录的姓名改为李四
5.删除:
delete from 表名 where 条件子句
例如:
delete from person where id=10
删除person中ID为10的记录
与SQLite相关的几个类:
1. SQLiteOpenHelper 是Android提供的管理数据库的工具类,主要用于数据库的创建/打开和版本更新等。该类是一个抽象类,在使用时需要创建SQLite类的子类,并重写它的 onCreate() 和onUpdate() 方法(这两个方法是抽象的,必须扩展)。
在SQLiteOpenHelper类中包含的方法主要如下:
(1)public abstract void onCreate(SQLiteDatabase db);
当数据库第一次被创建时调用该方法,通常在该方法中执行初始化操作,如创建表结构,插入初始数据等。
(2)public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
数据库版本发生变化时调用该方法。
(3)public void onOpen(SQLiteDatabase db) {}
当数据库打开时调用该方法。
(4)public SQLiteDatabase getReadableDatabase();
以读写的方式打开数据库对应的SQLiteDatabase 对象,该方法内部调用 getWritableDatabase() 方法, 返回的对象与getWritableDatabase()对象返回的方法一致,当数据库磁盘空间满了时,通过getWritableDatabase() 方法打开数据库就会出错,但通过getReadableDatabase() 方法会尝试以只读的方式打开数据库。
(5)public SQLiteDatabase getWritableDatabase();
以写的方式打开数据库对应的SQLiteDatabase 对象,一旦打开成功,将会缓存该数据库对象。
当调用SQLiteOpenHelper 的getWritableDatabase() 或getReadableDatabase() 方法获取SQLite 实例时,系统会根据数据库名称来判断该数据库是否存在,如果数据库不存在,Android系统会自动生成一个数据库,然后回调onCreate方法,在onCreate()方法中执行建表语句及添加一些初始化数据。如果数据库存在,系统再根据数据库的版本号来判断是否需要更新,如果版本号与之前的不一致,则需要更新,系统自动调用onUpgrade() 方法,在该方法中根据需要执行数据表的结构及数据更新。
2. SQLiteDatabase 是Android提供的SQLite 数据库的封装类,该类封装了一些操作数据库的API,通过该类可以完成数据的添加(Create)/查询(Retrieve)/更新(Update)和删除(Delete) 操作,分别提供了insert(), query(), update(), delete() 方法。此外还有两个实用的方法:execSQL() 和rawQuery() 方法。execSQL() 方法可以执行insert/delete/update 和 create table 之类有更改行为的SQL语句,而rawQuery() 用于执行select 语句。原型分别如下:
//----------执行带占位符(占位符用?表示)的SQL语句,如果SQL语句中没有占位符,则第二个参数可传null。
execSQL(String sql, Object[] bindArgs);
//----------执行SQL语句
execSQL(String sql);
//----------执行带占位符的SQL查询。
rawQuery(String sql, String[] selectionArgs);
3. Cursor 接口主要用于存放查询记录的接口,Cursor 是结果集游标,用于对结果集进行随机访问。Cursor 提供了以下方法来移动查询结果的记录指针:
(1)move(int offset);//----------------将记录指针向上(offset为负)或向下(offset为正)移动指定行数;
(2)moveToNext();//------------------将游标从当前记录移动到下一条记录,如果已经移过了结果集的最后一条记录,返回false,否则返回true;
(3)moveToPrevious();//--------------将游标从当前记录移动到上一记录,如果已经移过了结果集的第一条记录,返回false,否则返回true;
(4)moveToFirst();//------------------将游标移动到结果集的第一条记录,如果结果集为空,返回false,否则返回true;
(5)moveToLast();//------------------将游标移动到结果集的最后一条记录,如果结果集为空,返回false,否则返回true;
使用SQLiteDatabase 进行数据库操作的步骤:
(1)创建数据库的辅助类对象,指定数据库的名称和版本号(继承抽象类SQLiteOpenHelper 并实现onCreate() 和 onUpgrade() );
(2)调用辅助类的getReadableDatabase() 或getWritabelDatabase()方法,获取SQLiteDatabase 对象,该对象代表了与数据库的连接;
(3)调用SQLiteDatabase对象的相关方法来执行增/删/查/改操作;
(4)对数据库操作的结果进行处理,例如判断是否插入/删除或者更新成功,将查询结果记录转换成列表显示等;
(5)关闭数据库连接,回收资源。