1 SQLite简介
SQLite是一种轻量级的基于文件的数据库管理系统,由c语言编写,实现了标准SQL中的CRUD操作。SQLite具有小巧、高效的特点,因此常用于手机等嵌入式设备中来进行数据的存取和各种操作。
SQLite内部支持的数据类型
数据类型 | 说明 |
---|---|
NULL | 空值 |
INTEGER | 有符号整数 |
REAL | 浮点数,存储在8个字节的空间 |
TEXT | 文本字符串,以数据库编码方式存储文本 |
BLOB | 二进制字节数据 |
实际上SQLite完全可以接受varchar(n)、char(n)、decima(p,s)等数据类型,只不过SQLite会在运算或保存时将它们转换成上面5种数据类型中的相应类型。
2 SQLite基本操作
事实上SQLite同Java操作Mysql、SQL Server等基本相同。只不过操作步骤没有那么繁琐了而已。
2.1 操作顺序
以下步骤以android为例
1.安装SQLite。官网下载,然后配置环境
2.对应Android工程下导入相信数据库文件
3.创建SQLDatabase对象操作(这个SQLite对象相当于Java操作数据库中的Connection和Statement结合体)
2.2 SQLDatabase常用方法
常用静态方法打开或创建数据库
方法名 | 说明 |
---|---|
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags) | 打开path文件所代表的SQLite数据库 |
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) | 打开或创建(不存在)path文件所代表的SQLite数据库 |
static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory) | 打开或创建(不存在)file文件所代表的SQLite数据库 |
以上方法都是返回一个SQLDatabase数据库对象,此对象为操作的核心。
上边的CursorFactory factory是指明查询操作的Cursor对象,常采用默认工厂。
常用操作方法
方法名 | 说明 |
---|---|
executeSQL(String sql, Object[] bindArgs) | 执行带占位符的sql语句 |
executeSQL(String sql) | 执行sql语句 |
rawQuerySQL(String sql, String[] selectionArgs) | 执行带占位符的sql语句 |
除此之外,SQLlite还提供了其他大量方法,比如说insert、delete、update等
2.3 Cursor类提供方法
Cursor类似Java操作数据库中的ResultSet,因此方法大多类似。
常用方法
方法名 | 说明 | 方法名 | 说明 |
---|---|---|---|
move(int offset) | offset为正则下移,为负则上移 | boolean moveToNext() | 指针移向下一行 |
boolean moveToFirst() | 记录指针移到第一行 | boolean moveToLast() | 记录指针移到最后一行 |
boolean moveToPosition(int position) | 记录指针移到指定行 | boolean moveToPrevious() | 记录指针移到上一行 |
2.4 实例
public class DataConnection implements DataFunction{
SQLiteDatabase con = null;
public DataConnection(String path, String tableName) {
con = SQLiteDatabase.openOrCreateDatabase(path, null);
try {
con.execSQL("create table " + tableName
+ " (id varchar(10) primary key, name varchar(20) not null)");
} catch(SQLException e) {
e.printStackTrace();
}
}
@Override
public Cursor select(String tableName) {
Cursor cr = con.rawQuery("select * from " + tableName, null);
return cr;
}
@Override
public Cursor select(String tableName, String id) {
Cursor cr = con.rawQuery("select * from " + tableName
+ " where id = ?", new String[] {id});
return cr;
}
@Override
public boolean insert(String tableName, User user) {
boolean flag = true;
try {
con.execSQL("insert into " + tableName + " values(?, ?)",
new String[] {user.getID(), user.getName()});
} catch(SQLException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
@Override
public boolean delete(String tableName, String id) {
boolean flag = true;
try {
con.execSQL("delete from " + tableName + " where id = ?",
new String[] {id});
} catch(SQLException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
@Override
public boolean update(String tableName, String id, String name) {
boolean flag = true;
try {
con.execSQL("update " + tableName + " set name = ? where id = ?",
new String[] {name, id});
} catch(SQLException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
@Override
public boolean delete(String tableName) {
boolean flag = true;
try {
con.execSQL("delete from " + tableName);
} catch(SQLException e) {
e.printStackTrace();
}
return flag;
}
}
3 SQLiteOpenHelper
3.1 简介
顾名思义,这是一个工具类,主要用来帮我们创建或打开数据库。使用之前需要创建其子类,其子类会重写一个构造器以及两个方法。首先介绍构造器,接下来再介绍两个重写的方法。
构造器
public DataOpenHelper(Context context, String dbname, int version, String tableName, String sql) {
super(context, dbname, null, version);
}
需要调用父类构造器,并且传入四个参数。四个参数分别是:Context(可以理解为Activity),数据库名称,Cursor工厂(使用默认Cursor工厂),版本。
强调一下这个版本,首先这个版本是一个整型数值,是由程序员自己指定的。要求:版本需要是递增的,当系统即SQLiteOpenHelper的upgrade()方法检测到目前版本大于之前版本便会被调用执行。
当然我们也可以继续在子类构造器里添加其他内容。
方法
方法 | 说明 |
---|---|
onCreate(SQLiteDatabase db) | 创建指定地数据库,首次执行时调用 |
onUpgrade(SQLiteDatabase db, int oleVersion, int newVersion) | 指定数据库被更新时调用,第二、三参数分别用来指定需要被更新的旧的数据库版本号和更新后新的数据库版本号 |
onCreate(…)内通常放执行创建表的sql语句
3.2 实例
接下来实例主要是通过SQLiteOpenHelper创建数据库以及表,然后插入数据和读取数据。
SQLiteOpenHelper的子类
public class DataOpenHelper extends SQLiteOpenHelper{
String createTable;
String tableName;
public DataOpenHelper(Context context, String dbname, int version, String tableName, String sql) {
super(context, dbname, null, version);
createTable = sql;
this.tableName = tableName;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oleVersion, int newVersion) {
db.execSQL("drop table id exists " + tableName);
onCreate(db);
}
}
具体操作类
public class DataConnection {
SQLiteDatabase db;
String dbName = "temp";
int dbVersion = 1;
String dbTableName = "student";
DataOpenHelper helper;
String sql = "";
public DataConnection(Context context) {
sql = "create table student (id varchar(10) primary key, name varchar(20) not null)";
helper = new DataOpenHelper(context, dbName, dbVersion, dbTableName, sql);
db = helper.getWritableDatabase();
}
public boolean insert(String id, String name) {
boolean flag = true;
try {
db.execSQL("insert into " + dbTableName + " values(?, ?)", new String[] {id, name});
} catch(SQLiteException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
public Cursor select() {
Cursor cs = db.rawQuery("select * from student", null);
return cs;
}
}
这里只写了插入和查找方法,删除和更新类似。
这里这是测试,具体项目可以自行传入数据库名称、数据表名等。这里只给出了后台代码,具体活动中代码只是对后台的调用,因此不再给出。
执行完之后,我们可以通过DDMS File Explorer查看数据库位置。File Explorer内容很多,数据库在data文件夹下的data,具体位置在项目文件夹下。