概述:
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY(主键)的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略name字段的类型信息:
CREATE TABLE person (personid integerprimary key autoincrement, name varchar(20))
——事实上在sqlite中可以保存超过20个字段
使用步骤:
因为比较熟悉j2ee当中数据库的使用,故前两步以此为对比学习Android中SQLite数据库的使用。
1、创建数据库 3、为实体数据表创建Java bean
j2ee开发中,数据库由程序员手工创建。
Android开发中,数据库被自动创建:
使用Android提供的工具类SQLiteOpenHelper创建数据库。
public static class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
//参数一:上下文对象
//参数二:指定要生成的数据库名称 DATABASE_NAME="EasyDispatch"
//参数三:游标工厂(游标用于对查询后的结果集进行随机访问) null代表使用系统默认的游标工厂产生游标对象。
//参数四:数据库版本号(要求不能为0)DATABASE_VERSION="1"
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// 重载创建数据库的方法,在数据库第一次被创建的时候调用
@Override
public void onCreate(SQLiteDatabase db) {
//在这个方法中生成应用所需的数据表
//传入的参数SQLiteDatabase(数据库操作实例)中封装了针对数据库的所有操作,包括增删改查
// db.execSQL专门用来执行sql语句
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
}
// 重载更新数据库的方法,数据库版本变更的时候调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
2、加载驱动
j2ee开发中需要加载数据库驱动,创建连接。
使用SQLite数据库不用加载驱动,不用创建连接。
3、为实体数据表创建Java bean
4、创建Service类,加入增删改查方法。
5、Service中调用DBOpenHelper(参照项目中DBManager类的queryTaskReason方法)
6、语句的执行:
SQLiteOpenHelper helper = new DBOpenHelper (context);
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(“insert into person(name,phone) values (‘111’,’222’)”);
db.close(); //关闭数据库(当应用中只有一个地方使用数据库时,可以不将其关闭,//避免频繁打开数据库,提高性能)
插入、删除、修改SQL的执行方法:db.execSQL()
查找的执行方法:db.rawQuery()
返回一条记录:
Cursor cursor= db.rawQuery(“select…”);
// Cursor游标对象的作用:用于对查询返回的结果集进行随机方法。
//如果查询出的数据最多只有一条,移到第一条即可:
if(cursor.moveToFirst()){
String name= cursor.getString(cursor.getColumnIndex(“name”));
return name;
}
返回多条记录:
Cursor cursor= db.rawQuery(“select…”);
while (cursor.moveToNext()) {
String name= cursor.getString(cursor.getColumnIndex(“name”));
listName.add(name);
return listName;
}
备注:
SQLiteOpenHelper中的两个方法——getReadableDatabase()和getWritableDatabase()方法
getReadableDatabase()和getWritableDatabase()方法的区别:
数据库的磁盘空间满时不能调用getWritableDatabase()方法。
但是可以调用getReadableDatabase()方法,以只读方式打开数据库。