Android 数据存储——SQLite

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 创建数据库

创建数据库方法,分四类。

  1. create/createInMemory 在内存中创建数据库,当数据库关闭时即销毁。
  2. openDatabase 打开数据库,可以指定打开方式。
  3. openOrCreateDatabase 创建并打开数据库。
  4. getWritableDatabase/getReadableDatabase 打开读写,或只读数据库。

上述四个方式,都可以指定 CursorFactoryFlagsDatabaseErrorHandler(API 11)、OpenParams(API 27) 四个基本参数。最终都 执行到 openDatabase 方法。

SQLite 对数据库文件添加四种访问权限,做 flags 参数:

  1. OPEN_READWRITE:读写方式打开数据库文件,可以进行增删改查等操作。
  2. OPEN_READONLY:只读方式打开数据库文件,只能执行查询操作,插入数据会抛出异常 android.database.sqlite.SQLiteReadOnlyDatabaseException
  3. CREATE_IF_NECESSARY:打开数据库时,如没有数据库文件,便会自动创建,并允许增删改查。
  4. 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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值