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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H5:canvas刮刮乐

今日无事&#xff0c;写一个刮刮乐用于收割亲弟弟零花钱 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Title</title><style>body {height: 100vh;background-color: #fff;}.textDiv {…

数学之光照亮AI之路:探究数学背景在人工智能学习中的优势

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已成为引领未来发展的重要力量。然而&#xff0c;对于许多初涉此领域的学习者来说&#xff0c;AI的复杂性和深度常常让他们望而却步。有趣的是&#xff0c;那些数学基础扎实的人在学习AI时&#xff0c;往往…

2024 Android Studio安装及配置gradle快速省心搭建,不放C盘,前置搭建

题外话&#xff1a;要做安卓项目然后安装过Android Studio的朋友都知道&#xff0c;下载安装完成之后并不能直接开始你的第一个安卓项目的“ Hello World”&#xff0c;其中有要配置好gradle&#xff0c;在你测试好环境之前你会遇到很多问题&#xff0c;同时默认下使用中所需依…

Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.10 附近商户4.10.1 GEO介绍4.10.2 附近商户需求分析4.10.3 实现新增商户功能4.10.4 实现查询附近商户功能 4.11 用户签到4.11.1 用户签到需求分析4.11.2 BitMap介绍4.11.3 实现用户签到4.11.4 实现用户签到统计4.…

备战蓝桥杯---数学刷题3

话不多说&#xff0c;直接看题&#xff1a; 1. 我们可以得到大致一个思路&#xff0c;就是先枚举1-1e6的质数&#xff0c;然后看看有几个即可。 我们怎么知道个数呢&#xff1f; 首先我们知道1---n中有n/p的下取整个为p的倍数。 因此&#xff0c;p的个数至少是n/p的下取整个…

损失函数-交叉熵 梯度下降

文章目录 1、交叉熵的简单例子1.2、Classification Error&#xff08;分类错误率&#xff09;1.3、Mean Squared Error (均方误差)1.4、交叉熵损失函数1.5、二分类 2、什么是梯度下降法&#xff1f;2.2、梯度下降法的运行过程2.3、二元函数的梯度下降 1、交叉熵的简单例子 参考…

多模态小记:CLIP、BLIP与BLIP2

CLIP 使用网络上爬取得到的大量图文对进行对比学习&#xff0c;图文匹配的是正样本&#xff0c;图文不匹配的是负样本&#xff0c;使匹配样本的embedding之间的距离尽可能小&#xff0c;不匹配样本间的距离尽可能大。 缺点&#xff1a;网上爬的数据质量差&#xff0c;不能进行…

SOCKS代理是如何提高网络性能和兼容性的?

SOCKS代理作为一种网络协议中间件&#xff0c;不仅在提升网络隐私和安全性方面发挥着重要作用&#xff0c;也在提高网络性能和兼容性方面有着不容忽视的影响&#x1f680;。本文将深入探讨SOCKS代理如何通过减少网络延迟&#x1f680;、优化数据传输&#x1f504;、提高跨平台兼…

十进制,二进制,八进制,十六进制之间转换

一. 十进制转二进制 二. 二进制转十进制 三. 十进制转八进制 四. 八进制转十进制 五. 十进制转十六进制

数字档案馆升级改造的意义

数字档案馆升级改造的意义在于提升档案管理的效率和质量&#xff0c;更好地满足各方面的需求&#xff0c;并为数字时代的档案管理提供更好的支持和保障。具体意义包括&#xff1a; 1. 提高档案存储、检索和利用效率&#xff1a;玖拓智能数字化档案馆可以实现电子存储和快速检索…

el-tree如何修改节点点击颜色

el-tree修改点击节点颜色三大步 使用elementui库时&#xff0c;有时候我们会对里面提供的组件做一些样式修改。如果我们想要修改el-tree组件点击节点时的颜色&#xff0c;可以使用下面这种方式实现&#xff1a;

最新国产中文版官网chatGPT镜像网站

分享5个国产中文版chatGPT镜像网站&#xff0c;希望可以帮助到您&#xff01; 1️⃣ HiClaude3基于国外原版GPT模型、Claude模型开发&#xff0c;是资源丰富的全能镜像&#xff0c;适合各行各业的工作者。不仅有gpt&#xff0c;而且还支持图片对话、文件对话&#xff0c;轻松解…

项目存放在git上,在jenkins使用docker打包并推送到Ubuntu上运行

项目添加dockerfile 在需要打包的工程的根目录添加Dockerfile文件&#xff0c;文件内容&#xff1a; # 设置JAVA版本 FROM openjdk:8 # 指定存储卷&#xff0c;任何向/tmp写入的信息都不会记录到容器存储层 VOLUME /tmp# 拷贝运行JAR包 ARG JAR_FILE COPY ${JAR_FILE} app.jar…

08 - 镜像管理之:镜像仓库harbor介绍

本文参考&#xff1a;原文1 1 Harbor仓库介绍 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署我们私有环境内的Registry 也是非常必要的。 之前介绍了Docker私有仓…

适用于W波段GaAs开关设计的可扩展p-i-n二极管建模与参数提取技术

来源&#xff1a;Scalable p-i-n Diode Modeling and Parameter Extraction for Use in the Design of W-Band GaAs Switch&#xff08;TIE 21年&#xff09; 摘要 本文介绍了一种针对W波段开关设计的基于毫米波GaAs的p-i-n二极管的可扩展建模与参数提取方法。采用基于晶圆上…

创新指南|战略衡量的增长组织:用人工智能增强关键绩效指标(KPI)

传统的关键绩效指标 (KPI)越来越无法提供领导者取得成功所需的信息和见解。他们在跟踪进展、协调人员和流程、确定资源优先级以及推进问责制方面存在不足。本文是 2024 年第一份麻省理工学院 SMR - BCG 人工智能和商业战略全球高管学习和研究项目的调查结果——人工智能和业务战…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

上位机图像处理和嵌入式模块部署(qmacvisual动态插件卸载)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论过&#xff0c;qmacvisual虽然提供了很多的功能&#xff0c;包括的种类很多&#xff0c;但是总有一些功能是客户希望定制的。这些都是…

抖音小店无货源爆发期过了吗?现在还能做吗?

大家好&#xff0c;我是电商花花。 抖音小店爆发期过了吗&#xff1f; 我并不觉得&#xff0c;反而抖音小店的流量越来越大了&#xff0c;今年抖音小店日活跃用户已经突破到了9亿&#xff0c;有更大的市场和流量了&#xff0c;且现在做店越来越多了&#xff0c;再加上平台的支…

django 模板js文件为什么最后引入

<!-- 引入Bootstrap JS --> <script src"https://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/js/bootstrap.bundle.min.js"></script> 为什么最后引入例子 <!-- templates/inspection_records.html --><!DOCTYPE html> <html lang…