SQLite Android 绑定(十八)

news2025/3/1 4:48:12

返回: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.SQLException
  org.sqlite.database.DatabaseErrorHandler
</span></span>

而不是:

<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.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=secret
  file: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.coloradmin.cn/o/1584989.html

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

相关文章

数字货币:金融创新的未来?

随着科技的进步&#xff0c;数字货币作为一种新型的金融工具正逐渐走进人们的视线。那么&#xff0c;数字货币究竟是什么&#xff1f;它有哪些优势&#xff1f;它是否真的能够引领金融创新的未来&#xff1f;本文将从专业角度出发&#xff0c;深入探讨这些问题。 一、数字货币的…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…

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

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

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where i…

Qt6 multimedia开发一个摄像头录像机

Qt 6 附加模块multimedia可用于多媒体的开发&#xff0c;今天使用它可以快速开发一个摄像头录像机。 毕业季用作本科毕业设计软件应该可以的。 支持的功能 无边框窗口&#xff0c;并且支持拖拽&#xff0c;调整窗口大小切换摄像头配置摄像头原格式、分辨率、帧率、画面质量、…

opencv图像处理技术(形态学操作)

形态学&#xff08;Morphology&#xff09;是数学中研究形状、结构和变换的分支&#xff0c;而在图像处理中&#xff0c;形态学主要用于描述和分析图像中的形状和结构。形态学操作通常涉及基本的集合运算&#xff0c;如腐蚀、膨胀、开运算、闭运算等&#xff0c;以及与结构元素…

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

一个巧用委托解决的问题(C#)

个人觉得是委托应用的一个很好的例子&#xff0c;故做一下分享&#xff0c;希望能帮助到您&#xff0c;内容比较简单&#xff0c;大佬可以跳过。我是做桌面医疗软件开发的&#xff0c;前段时间在做一个需求。在签发检验项目医嘱时&#xff0c;调用第三方接口&#xff0c;然后带…

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术&#xff0c;可以生成各种类型的内容&#xff0c;包括文本、图像、音频和合成数据。那么什么是人工智能&#xff1f;人工智能和机器学习之间的区别是什么&#xff1f;有哪些技术特征&#xff1f; 人工智能是一门学科&#xff0c;是计算机科学的一…

漫途水产养殖水质智能监测方案,科技助力养殖业高效生产!

随着水产养殖业的蓬勃发展&#xff0c;水质和饲料等多重因素逐渐成为影响其持续健康发展的关键因素。由于传统养殖模式因监控和调节手段不足&#xff0c;往往造成养殖环境的恶化。需要通过智能化养殖&#xff0c;调控养殖环境&#xff0c;实现养殖的精细化管理模式&#xff0c;…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践&#xff1a;去哪儿旅游数据爬取指南 在这个博客中&#xff0c;我们将探索如何使用 Python 来进行网络数据抓取&#xff0c;并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取&#xff0c;从而获取旅游…

Go语言开发工具Vscode配置

Go语言开发工具Vscode配置方法分享&#xff1a; 1.下载安装vscode https://code.visualstudio.com/ 2.汉化vscode 3.vscode中安装Go语言插件 源自&#xff1a;大地老师Golang语言beego入门实战视频教程下载地址

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

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

[大模型]Qwen1.5-7B-Chat 接入 LangChain 搭建知识库助手

Qwen1.5-7B-Chat 接入 LangChain 搭建知识库助手 环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端…

String类(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

45-基于Kubernetes的云原生架构设计

云原生简介 云原生包含的概念很多&#xff0c;对于一个应用开发者来说&#xff0c;主要关注点是如何开发应用&#xff0c;以及如何部署应用。会主要介绍应用层的云原生架构设计和系统资源层的云原生架构设计。 CNCF&#xff08;云原生计算基金会&#xff09;简介 CNCF&#x…

竞品数据的监测范围

常规的数据监测一般指的是价格监测&#xff0c;品牌对线上产品链接中的页面价、到手价进行监测&#xff0c;同时也可监测标题变化、销量变化、库存变化、优惠信息变化等&#xff0c;对于对够执行数据监测的系统来说&#xff0c;不管哪个品牌的数据都可做到以上维度的监测&#…

SOCKS代理概述

在网络技术的广阔领域中&#x1f310;&#xff0c;SOCKS代理是一个核心组件&#xff0c;它在提升在线隐私保护&#x1f6e1;️、实现匿名通信&#x1f3ad;以及突破网络访问限制&#x1f6ab;方面发挥着至关重要的作用。本文旨在深入探讨SOCKS代理的基础&#xff0c;包括其定义…