SQlite数据库

简介

SQLite是一款轻型的数据库,关系型数据库;适用于嵌入式,占用资源非常低

  • 支持 ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 支持五种数据类型

    • NULL: 表示该值为NULL值

    • INTEGER: 无符号整型值

    • REAL: 浮点值

    • TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE

    • BLOB: 存储Blob数据,该类型数据和输入数据完全相同

  • 其他类型的数据会转换成五种基本数据类型存储

  • SQLite数据库文件存放路径/data/data//databases/

SDK提供的常用接口

接口 功能
SQLiteOpenHelper 抽象类,用于创建数据库和版本更新
SQLiteDatabase 数据库访问类,用于增删改查
Cursor 游标接口,作为返回值

CRUD:其中C代表添加(Create),R代表查询(Retrieve),U代表更新(Update),D代表删除(Delete)

数据库的创建

创建 SQLite 数据库的方法是实现 SQLiteOpenHelper 接口的子类,并且重写 onCreate() 方法,在该方法中执行用于创建 SQLite 数据库的命令

核心类(必要)

  • DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)构造函数
  • context:上下文环境(例如一个 Activity)
    • name:数据库名
    • cursorFactory:可选的游标工厂(通常是 Null)
    • version:版本号
  • onCreate(SQLiteDatabase db)初始化数据
  • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)数据库版本操作
    • db:一个SQLiteDatabase对象
    • oldVersion:旧版本号
    • newVersion:新版本号

关键代码

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
public class DatabaseHelper extends SQLiteOpenHelper {    

DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
//数据库第一次创建时被调用
db.execSQL("SQL");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//软件版本号发生改变时调用
db.execSQL("SQL");
}

@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
//打开数据库的回调函数
}
}

获取数据库对象

  • getReadableDatabase(): 返回一个可写数据库,返回一个SQLiteDatabase对象,通过这个对象进行数据库读写操作
  • getWritableleDatabase(): 返回一个可读数据库,返回一个SQLiteDatabase对象,通过这个对象进行数据库写入或读写操作

SQLite 数据库操作

SQLiteDatabase 对象提供了对数据库进行操作的一系列方法

打开或创建数据库

openOrCreateDatabase (Stringpath,SQLiteDatabase.CursorFactory factory)

Stringpath 数据库的路径

SQLiteDatabase.CursorFactory factory 游标

详细可见链接,详细介绍了三种创建方法,以及之间的联系

1
SQLiteDatabase database=SQLiteDatabase.openOrCreateDatabase("/data/data/1.db",null);

增加

insert (String table,String nullColumnHack,ContentValues values)

  • table:表名
  • nullColumnHack: 空列的默认值
  • values: ContentValues封装的键值对组成的Map,key代表列名,value代表该列要插入的值
1
2
3
4
ContentValues values=new ContentValues();
values.put("number", "0");
values.put("name", "zs");
database.insert("table", null, values);

删除

delete (String table,String whereClause,String[] whereArgs)

  • table:表名
  • whereClause:删除条件
  • whereArgs[]:条件值数组
1
2
3
String whereClause = "username=?";
String[] whereArgs = {"zs"};
db.delete("user",whereClause,whereArgs);

修改

update (String table,ContentValues values,String whereClause,String[] whereArgs)

  • table:表名
  • values: ContentValues 类型的键值对
  • whereClause:修改条件
  • whereArgs[]:修改的条件值数组
1
2
3
4
5
ContentValues values = new ContentValues();
values.put("name", "zs");
String whereClause = "username=?";
String[] whereArgs = {"ls"};
db.update("user",values,whereClause,whereArgs);

查询

1
query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
  • table:表名
  • columns[]:查询的列所有名称集
  • selection:WHERE之后的条件语句,可以使用占位符
  • selectionArgs:条件语句的参数数组
  • groupBy:指定分组的列名
  • having:指定分组条件,配合groupBy使用
  • orderBy:y指定排序的列名
  • limit:指定分页参数
  • distinct:指定“true”或“false”表示要不要过滤重复值
  • Cursor:返回值,相当于结果集ResultSet

    查询完会返回一个Cursor对象,代表数据集的游标

方法名称 方法描述
close() 关闭游标,释放资源
copyStringToBuffer(int columnlndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,并将其存储
getColumnCount() 返回所有列的总数
getColumnIndex( String columnName) 返回指定列的名称,如果不存在,就返回-1
getColumnIndexOrThrow(String columnN ame) 从零开始返回指定列的名称,如果不存在,将抛出异常
getColumnName(int columnlndex) 从给定的索引返回列名
getColumnNames() 返回一个字符串数组的列名
getCount() 返回Cursor中的行数
moveToFirst() 移动光标到第一行
moveToLast() 移动光标到最后一行
moveToNext() 移动光标到下一行
moveToPosition(int position) 移动光标到一个绝对的位置
moveToPreviousQ 移动光标到上一行

SQL

以上操作也可以通过直接执行sql语句实现

execSQL (String sql)

关闭

close()