文章目录
0 前言
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。(摘自百度百科)
鉴于 SQLite
具备如此优秀的业务处理能力,Android 平台自然使用它作为内置的数据库存储模块。存储在 SD 卡上,只是一个文件的形式,可以方便的备份、移植。有兴趣的小伙伴,可以至SQLite官网下载 C 源码研究研究。
另外 Android 平台提供了一整套的 SQLite 操作 API。可以方便快速的创建表、更新表、对表数据进行增删改查。
1 创建数据库
创建数据库方法,分四类。
- create/createInMemory 在内存中创建数据库,当数据库关闭时即销毁。
- openDatabase 打开数据库,可以指定打开方式。
- openOrCreateDatabase 创建并打开数据库。
- getWritableDatabase/getReadableDatabase 打开读写,或只读数据库。
上述四个方式,都可以指定 CursorFactory
、Flags
、DatabaseErrorHandler
(API 11)、OpenParams
(API 27) 四个基本参数。最终都 执行到 openDatabase
方法。
SQLite 对数据库文件添加四种访问权限,做 flags 参数:
- OPEN_READWRITE:读写方式打开数据库文件,可以进行增删改查等操作。
- OPEN_READONLY:只读方式打开数据库文件,只能执行查询操作,插入数据会抛出异常
android.database.sqlite.SQLiteReadOnlyDatabaseException
。 - CREATE_IF_NECESSARY:打开数据库时,如没有数据库文件,便会自动创建,并允许增删改查。
- NO_LOCALIZED_COLLATORS: 使 setLocale 方法不生效。
// 执行 query 方法时,使用该对象,用于生成 cursor
SQLiteDatabase.CursorFactory factory = new SQLiteDatabase.CursorFactory() {
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new SQLiteCursor(masterQuery, editTable, query);
}else
return new SQLiteCursor(db,masterQuery, editTable, query);
}
};
// 数据库发生异常时,执行该对象。
DatabaseErrorHandler errorHandler = new DatabaseErrorHandler() {
@Override
public void onCorruption(SQLiteDatabase dbObj) {
// 做关闭数据库的操作
dbObj.close();
}
};
// 打开数据库的参数,API 27 才支持。
SQLiteDatabase.OpenParams openParams = new SQLiteDatabase.OpenParams.Builder()
.setCursorFactory(factory) // 指定 CursorFactory
.setErrorHandler(errorHandler)// 指定 DatabaseErrorHandler
.addOpenFlags(SQLiteDatabase.CREATE_IF_NECESSARY) // 指定打开权限。
.build();
1.1 create
直接在内存中创建数据库,create/createInMemory 两个方法,后者在 API 27 才支持,建议使用 create。
/**
* 在内存中创建 SQLite 数据库,当数据库关闭时,即销毁。
* 适合临时保存数据。
*
* @param factory 可选参数,建议传入 NULL 或者构建 factory 实例。
* @return 返回数据库对象
* @throws 数据库创建失败时,抛出 SQLiteException
*/
@NonNull
public static SQLiteDatabase create(@Nullable CursorFactory factory) {
// This is a magic string with special meaning for SQLite.
return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH,
factory, CREATE_IF_NECESSARY);
}
/**
* 在内存中创建 SQLite 数据库,当数据库关闭时,即销毁。
* 适合临时保存数据。
*
* @param openParams 配置打开数据库的参数
* @return 返回数据库对象
* @throws 数据库创建失败时,抛出 SQLiteException
*/
@NonNull
public static SQLiteDatabase createInMemory(@NonNull OpenParams openParams) {
return openDatabase(SQLiteDatabaseConfiguration.MEMORY_DB_PATH,
openParams.toBuilder().addOpenFlags(CREATE_IF_NECESSARY).build());
}
都执行到 openDatabase 方法,Flags = CREATE_IF_NECESSARY。
1.2 openDatabase
/**
* 根据 flags 打开数据库
*
* @param path 创建或打开数据库的文件路径。可以使用相对地址或绝对地址。
* 相对地址存在应用缓存 database 目录,绝对地址可以存在 sd 卡目录下。
* @param factory 可选参数,建议传入 NULL 或者构建 factory 实例。
* @param flags 控制数据的方式方式,
* @return 返回打开新打开的数据库
* @throws 数据库创建失败时,抛出 SQLiteException
*/
public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory,
@DatabaseOpenFlags int flags) {
return openDatabase(path, factory, flags, null);
}
/**
* 根据 flags 打开数据库
*
* @param path 打开或创建数据库的文件
* @param factory 可选参数,建议传入 NULL 或者构建 factory 实例。
* @param flags 控制数据库文件的访问方式
* @param errorHandler 当 SQLite 报出数据库出错时,使用 DatabaseErrorHandler 处理错误。如关闭数据库。
* @return 返回打开新打开的数据库
* @throws 数据库创建失败时,抛出 SQLiteException
*/
public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory,
@DatabaseOpenFlags int flags, @Nullable DatabaseErrorHandler errorHandler) {
SQLiteDatabase db = new SQLiteDatabase(path, flags, fa