SQLite Android 绑定(十八)

返回:SQLite—系列文章目录   

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

下一篇:SQLite—系列文章目录   

应用程序编程

加载共享库

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

<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”。例如,以下内容:

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

应替换为:

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

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

<span style="color:#444444"><span style="background-color:#ffffff">  org.sqlite.database.SQLExceptionorg.sqlite.database.DatabaseErrorHandler
</span></span>

而不是:

<span style="color:#444444"><span style="background-color:#ffffff">  android.database.SQLExceptionandroid.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.csqlite3.h

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

  # If using SEE, uncomment the following:# LOCAL_CFLAGS += -DSQLITE_HAS_CODEC

2. 应用代码说明

2.1. 打开加密数据库

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

<span style="color:#444444"><span style="background-color:#ffffff">  file:DatabaseName.db?key=secretfile:DatabaseName.db?hexkey=0123ABCD
</span></span>

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

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

<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() 回调。例如:

<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 开发周期的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAP ADBC_QUERY 测试代码

项目中使用的接口取数采用的是DBLink的方式&#xff0c;对方提供的表名太长&#xff0c;超过标准程序ADBC_QUERY的参数长度&#xff0c;于是写了一份简单的测试代码用来测试连接和取数。 DBCO配置&#xff1a; 测试程序&#xff1a; 程序源码&#xff1a; *&------------…

实验五 智能手机互联网程序设计(微信程序方向)实验报告

请完成数值比较任务&#xff1b; 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; index.js Page({ /** * 页面的初始数据 */ data: { num1:0, num2:0, num3:"" }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { },…

14款DevOps/SRE工具,助力提升运维效率

简介 随着平台工程的兴起&#xff0c;DevOps 和 SRE 不断发展&#xff0c;带来了新一代工具&#xff0c;旨在提高软件开发和运维的效率、可扩展性和可靠性。 在本篇文章中&#xff0c;我们将深入探讨一些最具发展前景的工具&#xff0c;它们正在塑造持续集成与部署、监控与可观…

【c语言】自定义类型:结构体详解

目录 自定义类型&#xff1a;结构体 结构体类型的声明 结构体变量的创建和初始化 结构的特殊声明 结构的自引用 结构体内存对齐 对其规则 为什么存在内存对齐&#xff1f; 修改默认对⻬数 结构体传参 结构体实现位段 位段的内存分配 位段的跨平台问题 位段的应用…

SpringBoot实现RabbitMQ的通配符交换机(SpringAMQP 实现Topic交换机)

文章目录 pomyml生产者消费者 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符&#xff01; Routingkey 一般都是有一个或多个单词组成&#xff0c;多个单词…

2024年思维100春季线上比赛倒计时9天,来看看官方样题

今天是2024年4月11日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有9天。今年思维100活动的考试重点是什么呢&#xff1f;虽然主办方未公布&#xff0c;我们可以从主办方发布的参考题目中来推测今年的考试重点&#xff0c;并且按照这个来举一反三&#x…

基于GAN的多变量时间序列污染训练集异常检测

论文地址&#xff1a;https://ieeexplore.ieee.org/document/9618824 论文源码&#xff1a;https://github.com/sxxmason/FGANomaly 期刊&#xff1a;IEEE Transactions on Knowledge and Data Engineering 多元时间序列异常检测在结构健康监测、智能运维、量化交易等诸多实际…

谷粒商城实战(012 业务-商城业务)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第203p-第p210的内容 介绍 这段除了210集都是商城业务&#xff0c;无太多可学习的&#xff0c;可跳过这7集&#xff0c;直接看第2100集 一个页…

CentOS 7.9安装过程的一些小插曲

首先请允许我推荐一下这款制作U盘启动盘的软件 Rufus - 轻松创建 USB 启动盘Rufus: Create bootable USB drives the easy wayhttps://rufus.ie/zh/ Rufus 是一款格式化和创建 USB 启动盘的辅助工具。 本软件适用于以下场景&#xff1a; 需要将可引导 ISO (Windows、Linux、UE…

Django之rest_framework(二)

格式后缀 为了使我们的响应不再硬连接到单个内容类型这一事实,我们可以将API格式后缀添加到API之后。使用格式后缀为我们提供了明确引用给定格式的URL,譬如:http://example.com/api/items/4.json 官网:2 - Requests and responses - Django REST framework views:在函数…

大厂Java笔试题之求一个整数转换为二进制后所有位上1的个数

题目&#xff1a;给定一个整数&#xff0c;求这个整数转换成二进制以后&#xff0c;所有位上1的个数&#xff08;数字大小不超过32位数字的范围&#xff09;。比如8这个整数&#xff0c;转换成二进制是00001000&#xff0c;那么就是输出1。public class Demo5 {public static v…

css实现扫码循环扫描特效

摘要&#xff1a; 需求中需要模拟扫描的效果来实现户型的生成&#xff01;由于接口ai生成的图片户型时间比较长&#xff0c;所以需要模拟特效&#xff01; <!DOCTYPE html> <html><head><mate charset"UTF-8" /><title>扫描</title…

FME学习之旅---day22

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;栅格入门 FME 支持读取和写入 70 多种栅格格式。本教程将介绍几个基本示例&#xff0c;展示如何使用 FME 读取、转换和写入栅格数据。 FME 数据检查器不应用任何对比度增强。因…

删除链表的倒数第 N 个结点 - LeetCode 热题 29

大家好&#xff01;我是曾续缘&#x1f916; 今天是《LeetCode 热题 100》系列 发车第 29 天 链表第 8 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头…

SpringBoot菜品分页查询模块开发(多表连接查询)

需要注意的地方 为什么创建VO类怎么进行多表连接查询分页查询的统一返回结果类PageResult分页查询Mapper的返回结果是Page<目标实体类> 需求分析与设计 一&#xff1a;产品原型 系统中的菜品数据很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波——附3个算法源码

效果&#xff1a; MPU6050姿态解算-卡尔曼滤波四元数互补滤波 目录 基础知识详解 欧拉角 加速度计(Accelerometer)与姿态测量 陀螺仪(Gyroscope)与姿态测量 姿态解算算法1-互补滤波 姿态解算算法2-四元数法 姿态解算算法3-卡尔曼滤波 组成 1.预测状态方程 2. 预测协方…

Java | Leetcode Java题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isValid(String s) {int n s.length();if (n % 2 1) {return false;}Map<Character, Character> pairs new HashMap<Character, Character>() {{put(), ();put(], [);put(}, {);}};Deque<…

蓝桥 python笔记15——矩阵运算、基础数论、GCD和LCM、质数、唯一分解定理、快速幂

目录 矩阵运算 基础数论 GCD和LCM 质数 唯一分解定理 快速幂 矩阵运算 矩阵加减法&#xff1a; 矩阵和数相乘&#xff1a; 矩阵转置&#xff1a; 矩阵乘法&#xff1a; # 矩阵乘法 def mul(A,B):N,Mlen(A),len(A[0])#行数&#xff0c;列数_M,Klen(B),len(B[0])if M!_M:re…

rsync 远程同步----------安全高效的异地备份方案

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器------…

Linux 函数学习 poll

1、Linux poll 函数 int poll(struct pollfd *fds, nfds_t nfds, int timeout); fds&#xff1a; 需要轮询的fd集合 nfds&#xff1a;需要轮询的fds数量 timeout&#xff1a;超时时间 返回值&#xff1a;0 超时&#xff0c;<0 发生异常&#xff0c;> 0 存在数据变化 …