SQLite Android 绑定(十八)

返回:SQLite---系列文章目录

上一篇:SQLite 在Android安装与定制方案(十七)

下一篇:SQLite---调试提示(十九)

应用程序编程

加载共享库

在使用任何与 SQLite 相关的方法或对象之前,本机 SQLite 必须使用以下代码将库加载到应用程序中:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  System.loadLibrary("sqliteX");
</span></span>

确保足够早地加载共享库的一种方法是 将其添加到应用程序声明的"静态"块中 main Activity 类。

如果在加载共享库之前调用了 SQLite 相关方法, 应用程序将出现段错误(崩溃,没有错误消息或异常)。

使用 SQLite Android 绑定类

构成内置 Android SQLite 接口的类位于 "android.database.sqlite"命名空间。此接口提供所有 相同的类,但"org.sqlite.database.sqlite"命名空间中的类除外。 这意味着要修改应用程序以使用 SQLite,通常只需要替换所有出现的 "android.database.sqlite"在源代码中使用 "org.sqlite.database.sqlite"。例如,以下内容:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  import android.database.sqlite.SQLiteDatabase;
</span></span>

应替换为:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  import org.sqlite.database.sqlite.SQLiteDatabase;
</span></span>

以及替换 android.database.sqlite.* 命名空间中,则应用程序还必须确定 要使用以下两种方法:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  org.sqlite.database.SQLException
  org.sqlite.database.DatabaseErrorHandler
</span></span>

而不是:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  android.database.SQLException
  android.database.DatabaseErrorHandler
</span></span>

与内置SQLite支持的区别

除了命名空间更改之外,还有其他差异 应用程序需要注意的股票 Android 界面:

  1. The SQLiteStatement.simpleQueryForBlobFileDescriptor()API 不可用。
  2. 排序规则序列"UNICODE"不可用。
  3. 排序规则序列"LOCALIZED",通常随 system的当前语言环境,总是等同于SQLite构建的 在归类二进制中。

使用 SQLite 加密扩展

SQLite 加密扩展提供了一种创建、读取和写入加密数据库文件的简单方法。 它可以与 SQLite Android 绑定一起使用以添加加密数据库 适用于任何应用程序的能力。

1. 构建支持 SEE 的版本

除非您使用预构建的 aar 文件来使用 带有您需要构建的 SQLite Android 绑定的 SEE 扩展 自定义版本,可以作为自定义 AAR 文件,也可以直接将代码与应用程序集成

为此,请按照上面链接的说明进行操作。除了,在运行之前 构建本机库的命令:ndk-build

替换 and 文件 使用 SEE 启用版本(即 sqlite3.c 和 see.c - 的串联 有关详细信息,请参阅上面的链接)。sqlite3.c``sqlite3.h

编辑 Android.mk 文件,以便取消注释两者中的第二个 以下为:

verbatim 复制代码
  # If using SEE, uncomment the following:
  # LOCAL_CFLAGS += -DSQLITE_HAS_CODEC

2. 应用代码说明

2.1. 打开加密数据库

打开现有加密数据库或创建新数据库的最佳方式, 将加密密钥指定为 SQLite URI 数据库标识符的一部分。为 示例,而不是"DatabaseName.db",而是以下项之一:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  file:DatabaseName.db?key=secret
  file:DatabaseName.db?hexkey=0123ABCD
</span></span>

上面的第一种形式,指定文本键,需要 SQLite 版本 3.19.0。

或者,在打开或创建加密数据库后, 应用程序可以立即执行 PRAGMA 来配置加密 钥匙。在调用任何其他数据库方法之前,必须执行此操作。为 例:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  import org.sqlite.database.sqlite.SQLiteDatabase;

    ...

  SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("my.db", null);
  db.execSQL("PRAGMA key = 'secretkey'");
</span></span>

或者,如果您使用的是 SQLiteOpenHelper 帮助程序类,则 PRAGMA 必须是在 onConfigure() 回调。例如:

verbatim 复制代码
<span style="color:#444444"><span style="background-color:#ffffff">  import org.sqlite.database.sqlite.SQLiteDatabase;
  import org.sqlite.database.sqlite.SQLiteHelper;

    ...

  class MyHelper extends SQLiteOpenHelper {
    ...
    void onConfigure(SQLiteDatabase db){
      db.execSQL("PRAGMA key = 'secretkey'");
    }
    ...
  }
</span></span>

请注意,使用 PRAGMA 指定加密密钥,如上所述 与 WAL 模式不兼容。在 Android 中,启用 WAL 模式还可以启用 引擎盖下的连接池。这增加了多线程的并发性 应用程序,但也使得使用SQLite配置加密密钥 直接使用 PRAGMA 不安全(因为 Android 可能会创建和使用新的 SQLite 任何时候都未配置的连接)。

有关加密密钥的更多详细信息,请参阅 SEE 文档

2.2. 加密现有数据库或更改加密密钥

未加密的数据库可以被加密,或者 使用"PRAGMA rekey"或"PRAGMA rehexkey"更改现有数据库 SEE文档中的"使用"密钥"PRAGMA"中描述的命令。

如果使用 WAL 模式,则会遇到与"PRAGMA 密钥"相同的问题 - 在(重新)加密数据库后,它只修改内部使用的密钥 通过连接池中的一个连接。这意味着当 Android 尝试使用不同的连接来访问它抛出的数据库 "文件已加密或不是数据库"异常 (SQLITE_NOTADB)。应用 因此,需要修改 WAL 模式数据库的加密密钥时,应 创建一个新的 SQLiteDatabase(或 SQLiteOpenHelper)对象来访问 数据库,将新键指定为新 URI 标识符的一部分, 在运行"PRAGMA rekey"后立即。

2.3. 与非 SEE 构建的其他区别

除了支持加密数据库外,启用 SEE 的构建还表现良好 在另外两个方面有所不同:

在 Android 中,如果遇到数据库损坏,或者尝试 用于打开不是 SQLite 数据库的文件,默认 行为是删除文件并在 它的位置。在启用了 SEE 的构建中,默认行为是抛出 异常。

这样做的原因是提供了不正确的加密密钥 与打开不是数据库文件的文件没有区别。 在这种情况下,简单地删除文件似乎太危险了。

可以使用 DatabaseErrorHandler 接口重写默认行为。

此模块的早期版本禁用了 WAL 模式连接池 完全用于启用 SEE 的构建。这改变了 这里是 3.19.0 开发周期的一部分。

相关推荐
拭心3 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
yuanbenshidiaos5 小时前
c++---------数据类型
java·jvm·c++
带电的小王5 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡6 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道6 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库7 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道7 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe8 小时前
Android Hook - 动态加载so库
android
java1234_小锋8 小时前
JVM对象分配内存如何保证线程安全?
jvm
居居飒8 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin