Android SQLite,是一款轻量级的关系型数据库。在很多嵌入式设备都用来存储数据。
SQLite介绍
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。
SQLite特点
- 轻量级
使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。 - 独立性
SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。 - 隔离性
SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。 - 跨平台
SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android和IOS。 - 多语言接口
SQLite 数据库支持多语言编程接口。 - 安全性
SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。 - 弱类型的字段
同一列中的数据可以是不同类型
SQLite数据类型
SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。
您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
存储类 | 描述 |
---|---|
NULL | 值是一个 NULL 值。 |
INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
SQLiteDatabase的介绍
Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。
方法 | 描述 |
---|---|
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 |
delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() | 关闭数据库 |
打开或创建数据库
在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
打开或者创建一个数据库。它会自动去检测是否存在这个数据库,如果存在则打开,不存在则创建一个数据库;创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。
下面是创建名为“stu.db”数据库的代码:openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
参数1 数据库创建的路径
参数2 一般设置为null就可以了
1 | db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null); |
创建表
创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)
1 | private void createTable(SQLiteDatabase db) |
判断数据表是否存在
sqlite_master这个表是系统的表,sqlitedatabase会为每一个数据库创建一个这样的表,目的是用来记录用户自己创建的表的索引。如果用户进行了表的增删改查操作,这个表都会相应的进行索引的改动。通过查询sqlite_master,判断表是否存在。
1 | private boolean isTableExist() |
数据表删除
1 | private void drop(SQLiteDatabase db) |
数据总记录数
1 | public long allCaseNum( ){ |
插入数据
两种方式插入数据
SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
参数1 表名称,
参数2 空列的默认值
参数3 ContentValues类型的一个封装了列名称和列值的Map;1
2
3
4
5
6
7
8
9
10
11private void insert(SQLiteDatabase db)
{
// 实例化常量值
ContentValues cValue = new ContentValues();
// 添加用户名
cValue.put("sname","xiaoming");
// 添加密码
cValue.put("snumber","01005");
// 调用insert()方法插入数据
db.insert("stu_table",null,cValue);
}编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
1
2
3
4
5
6
7private void insert(SQLiteDatabase db)
{
//插入数据SQL语句
String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";
//执行SQL语句
db.execSQL(sql);
}
删除数据
两种方式
调用
SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)
方法
参数1 表名称
参数2 删除条件
参数3 删除条件值数组1
2
3
4
5
6
7
8
9private void delete(SQLiteDatabase db)
{
// 删除条件
String whereClause = "id=?";
// 删除条件参数
String[] whereArgs = {String.valueOf(2)};
// 执行删除
db.delete("stu_table",whereClause,whereArgs);
}编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除
1
2
3
4
5
6
7private void delete(SQLiteDatabase db)
{
// 删除SQL语句
String sql = "delete from stu_table where _id = 6";
// 执行SQL语句
db.execSQL(sql);
}
修改数据
两种方式
调用
SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)
方法
参数1 表名称
参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件(where字句)
参数4 更新条件数组1
2
3
4
5
6
7
8
9
10
11
12
13private void update(SQLiteDatabase db)
{
// 实例化内容值
ContentValues values = new ContentValues();
// 在values中添加内容
values.put("snumber","101003");
// 修改条件
String whereClause = "id=?";
// 修改添加参数
String[] whereArgs={String.valuesOf(1)};
// 修改
db.update("usertable",values,whereClause,whereArgs);
}编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新
1
2
3
4
5
6
7private void update(SQLiteDatabase db)
{
// 修改SQL语句
String sql = "update stu_table set snumber = 654321 where id = 1";
// 执行SQL
db.execSQL(sql);
}
查询数据
在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()
方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
方法 | 描述 |
---|---|
getCount() | 获得总的数据项数 |
isFirst() | 判断是否第一条记录 |
isLast() | 判断是否最后一条记录 |
moveToFirst() | 移动到第一条记录 |
moveToLast() | 移动到最后一条记录 |
move(int offset) | 移动到指定记录 |
moveToNext() | 移动到下一条记录 |
moveToPrevious() | 移动到上一条记录 |
getColumnIndexOrThrow(String columnName) | 根据列名称获得列索引 |
getInt(int columnIndex) | 获得指定列索引的int类型值 |
getString(int columnIndex) | 获得指定列缩影的String类型值 |
示例:查询数据
1 | private void query(SQLiteDatabase db) |
SQLiteOpenHelper
该类是SQLiteDatabase一个辅助类。这个类主要生成一 个数据库,并对数据库的版本进行管理。在特殊情况下,即当打开外部数据库如/sdcard/sqlite.db
,则不会执行管理;而一般情况下,即打开/data/data/package/databases/
应用里的内部数据库会执行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:
onCreate(SQLiteDatabase)
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。onUpgrade(SQLiteDatabase,int,int)
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。onOpen(SQLiteDatabase)
这是当打开数据库时的回调函数,一般在程序中不是很常使用。
SQLiteOpenHelper操作内部数据库
数据库帮助类SQLiteOpenHelper操作内部数据库时,在应用安装后第一次启动时会执行onCreate方法,在此方法中创建数据库。
1 | public class DBUtils extends SQLiteOpenHelper { |
SQLiteOpenHelper操作外部数据库
数据库帮助类SQLiteOpenHelper操作外部数据库时,在应用安装后第一次启动时不会执行onCreate方法。
借助ContextWrapper类打开外部数据库,注意数据库文件需要判断是否存在,否则报错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35public class DatabaseContext extends ContextWrapper {
private String mDBPath = null;
private DatabaseContext(Context base) {
super(base);
}
public DatabaseContext(Context base, String dbPath) {
super(base);
mDBPath = dbPath;
}
public File getDatabasePath(String name) {
String dbPath = mDBPath + name;
if (FileUtils.isFileExists(dbPath)) {
return new File(dbPath);
} else {
return null;
}
}
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
int flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;
return SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, null);
}
public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
int flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;
return SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, errorHandler);
}
}创建数据库帮助类,开启数据库操作
1
2
3
4
5
6
7
8
9
10public class UtilDao
{
private void initDao()
{
// DB_PATH 数据库文件路径,如:/sdcard/db/sqlite.db
DatabaseContext dbContext = new DatabaseContext(mContext, DB_PATH);
// 然后创建数据库帮助类,后面的操作与内部数据库一致。参数Context、数据表名、数据库版本号等
DBUtils dbUtils = new DBUtils(mContext, tableName, null, dbVersion);
}
}
Android常用SQLite命令
打开数据库
1
> sqlite3 sql
查看
1
2
3
4sqlite> .database // 显示数据库信息
sqlite> .tables // 显示表名
sqlite> .schema // 命令可以查看创建数据表时的SQL命令
sqlite> .schema table_name // 查看创建表table_name时的SQL的命令插入记录
1
insert into table_name values (field1, field2, field3...);
删除
1
drop table if exists table_name; // 删除表
修改
1
update table set field1='xxxxx' where option1='';
查询
1
2select * from table_name; // 查看table_name表中所有记录
select * from table_name where field1='xxxxx'; // 查询符合指定条件的记录