SQLite 拓展
此SQLite 拓展由中文网开发及维护,基于开源 aix-SQLite 拓展。
与 TaifunSQLite 功能类似,但TaifunSQLite是收费的,美刀。
- .aix 拓展下载:
SQLite
SQLite 是 Android 内置的小型、快速、独立的 SQL(结构化查询语言)数据库引擎。 SQL 语句用于创建、选择、更新和删除一个或多个表中的数据。SQL 允许表之间建立复杂的关系,并提供一种表达方式来查找存储在数据库中的数据。
特性
- 控制数据库名称
- 导入/导出整个数据库
- 常见 CRUD( 增加(Create)、读取(Read)、更新(Update)和删除(Delete) ) 操作方法
- 数据操作方法的内联和异步版本
- 可以使用参数化 SQL 语句(防止 SQL 注入)
- 查询结果以正确列表的形式返回
- 数据库生命周期事件
- 调试消息作为 Toast 消息和/或对话框
- 开始、提交和回滚事务(也可以嵌套!)
- 数据库版本控制
- 还有更多!
如果您没有看到您喜欢或需要的功能,请告诉我!
如何使用
- 打开“界面设计”视图。
- 在左侧面板的底部,打开“扩展”类别。
- 单击“导入扩展”链接。
- 选择您上面下载的 aix 文件,然后单击“导入”按钮。
- 等待几秒钟,您应该会看到一条消息,提示扩展已导入。您还应该看到 SQLite 扩展出现在“扩展”类别中。
- 将 SQLite 扩展拖到您的应用程序中并继续!
背景
在编写此扩展之前,我从未进行过任何 Android 编程。我突然需要一款小型应用,这将是一次完美的学习体验。从小处着手,我遇到了 App Inventor 以及该平台的所有变体。经过一番研究,我得出结论,这将是一个不错的入门方式。
无需赘述,我的小型应用将受益于合适的数据库,而不是 App Inventor 及其同类产品中包含的 TinyDB 或其他键/值存储。由于我有深厚的编程背景,SQL 不会困扰我,而且我已经熟悉 SQLite。
我很高兴地发现 SQLite 是 Android 平台的一部分。
在研究 App Inventor 期间,我发现了创建扩展的能力以及所有可用的各种免费和付费扩展。App Inventor 平台已经有一些可用的 SQLite 扩展,但各种选项都不能满足我的需求。
除了构建我的第一个 Android 应用之外,我还借此机会学习如何构建 App Inventor 扩展。
属性
此属性定义数据库文件的名称。其默认值为“db.sqlite”。
打开数据库后更改名称不会对数据库产生影响。
使用此属性可以在打开数据库之前更改名称。
这是数据库的“版本”,应用将定义它与哪个版本的数据库兼容。
当打开数据库并且其版本与此版本不匹配时,将触发 DatabaseUpgrade 或 DatabaseDowngrade 事件,以允许您修改数据库以使其兼容。
此设置会影响各种 Select 方法返回结果行的方式。
当此属性为 false 时,Select 方法返回的列表中的每个元素将是一个简单的值列表,这些值表示为每个匹配行选择的列的值。
当此属性为 true 时,Select 方法返回的列表中的每个元素将是一串对的列表,这些对表示为每个匹配行选择的列的名称和值。
此属性可打开或关闭简单的调试消息。这些消息显示为 Toast 消息,并在几秒钟后消失。
在调试应用程序时打开此功能可查看数据库正在做什么。
此属性可打开或关闭简单调试消息。这些消息显示为带有“确定”按钮的对话框。
这些消息直到对话框关闭后才会消失。在调试应用程序时打开此功能可查看数据库正在执行的操作。
注意:已证明对话框的显示顺序可能与对话框指示的实际操作顺序相反。因此,建议首选使用 DebugToast 进行调试。
事件
此事件在数据库打开(或创建)后触发。
此事件在数据库创建后触发,因为打开时文件不存在。此事件在 DatabaseOpen 事件之前触发。
注意: 如果数据库文件存在,则有时此事件会触发。请参阅 ImportDatabase 方法描述中的注释。
当 DBVersion 属性值大于打开时现有的数据库版本时,将触发此事件。事件结束后,数据库版本将设置为与 DBVersion 属性匹配。
使用此方法对数据库进行必要的更改,使其与应用程序所需的版本匹配。
当 DBVersion 属性值小于打开时现有的数据库版本时,将触发此事件。事件结束后,数据库版本将设置为与 DBVersion 属性匹配。除了极少数用户降级到应用程序的旧版本的情况外,通常不会使用此事件。
使用此方法对数据库进行必要的更改,使其与应用程序所需的版本匹配。
当数据库关闭时触发此事件。
只要出现 SQL 错误,就会触发此事件。这通常发生在您做错事的时候,例如尝试从不存在的表或列中进行选择,或者在尚未启动事务的情况下提交事务。
方法
常规
返回数据库文件的路径,无论它是否存在。
将未打开的数据库文件逐字节复制到指定文件。 前缀“/”指定外部 SD 卡上的文件。 无前缀指定相对于应用程序私有存储的路径。
将指定的 SQLite 数据库文件逐字节复制到 DBName 属性指定的文件中。
导入的文件必须是完整格式的二进制 SQLite 数据库文件,不是原始 SQL 语句(为此使用 ExecuteFile 方法)。
前缀“//”指定应用程序资产中的文件。
前缀“/”指定外部 SD 卡上的文件。
无前缀指定相对于应用程序私有存储的路径。
此方法可用于在应用程序首次运行时初始化数据库。只需将完整格式的 SQLite 数据库文件上传到应用程序的资产中,此函数就会将其复制到位。
注意:如果您导入的数据库尚未包含完整格式的“android_metadata”表,则 DatabaseCreated 事件将在首次打开数据库时触发。“android_metadata”表是 Android 跟踪数据库版本的地方,因此当它不存在时,它会认为数据库是新的,即使它已经包含其他表。任何其他现有表都不会被修改。
删除由 DBName 属性指定的未打开的数据库文件。使用此方法可以彻底销毁数据库并重新开始。
如果 DBName 属性指定的数据库文件存在,则返回 true,否则返回 false。
打开由 DBName 属性命名的数据库。如果文件不存在,则将创建该文件并触发 DatabaseCreated 事件。
如果文件的版本与 DBVersion 属性不同,则将触发DatabaseUpgrade 或 DatabaseDowngrade 事件。
触发任何这些事件后,DatabaseOpened 事件将最后触发。
打开已打开的数据库无效。
关闭之前打开的数据库,回滚所有未提交的事务,并触发 DatabaseClosed 事件。关闭已关闭的数据库不会产生任何效果。
如果数据库打开则返回 true,否则返回 false。
返回打开的数据库中表的数量。
如果打开的数据库中存在指定的表,则返回 true,否则返回 false。
返回打开的数据库中的表名列表。
返回打开的数据库中的表的行数。
事务
事务允许以“全有或全无”的方式操作数据。
事务启动后,所有更改数据的操作都会被数据库“记住”,直到它们被“提交”或“回滚”。
提交事务会告诉数据库,“我确实想做所有这些事情,所以现在保存结果”,而回滚事务则意味着“忘记我告诉你要做的所有事情”。
使用事务是可选的,但它是确保数据库中数据完整性的重要工具。
开始事务。事务可以嵌套(事务内有事务)。
确保为每个打开的事务调用 CommitTransation 或 RollbackTransaction。
将事务期间所做的更改提交(保存)到数据库。
回滚(放弃)事务期间对数据库所做的更改。
数据操作
本节中的方法用于创建、删除和以其他方式操作数据库中的数据。
它们都有异步版本和相应的事件。异步方法在后台线程上执行工作,因此不会阻塞主 UI 线程。这对于在可能需要超过 100 毫秒左右的操作期间获得良好的用户体验非常重要。阻塞主 UI 线程将使您的应用程序看起来“冻结”并变得无响应,用户不喜欢这样。
当您需要执行需要一段时间的数据库操作(如选择、更新、删除、插入数百行)时,请使用异步方法。
当异步方法可用时,它将接受与同步版本相同的参数,并添加“tag”参数。“tag”是您提供的任意字符串参数,并将传递给与异步方法相对应的“After”事件。您可以使用标签来区分事件处理程序中的多个结果。
这些方法执行任意的非 SELECT SQL 语句,可选择绑定参数。
有关详细信息,请参阅下面有关 绑定参数 的部分。
这些方法执行文件中包含的一个或多个 SQL 语句。
文件可以包含 SQL 语句、空行和注释。行内注释以“–”开头,以行末结束。多行注释以“\*”开头,以“*/”结尾。通过使用“\”作为断行中的最后一个字符,还可以支持行延续。每个语句都可以选择以分号结尾。
在任何 SQL 语句中,文字字符串“\n”将替换为实际换行符。
执行在第一个错误处停止。这些方法返回成功执行的语句数。
文件名前缀“//”指定应用资产中的文件。
文件名前缀“/”指定外部 SD 卡上的文件。
无前缀指定相对于应用私有存储的路径。
建议在事务内使用这些方法,因为如果发生错误,它们可能会导致部分执行。通常,您希望文件中的所有语句都起作用,或者根本不起作用。
这些方法执行带有可选绑定参数的 SQL SELECT 语句,该语句返回包含零行或多行数据的列表。
有关详细信息,请参阅下面有关 绑定参数 的部分。
虽然这里没有显示,但查询完成后,会从 SelectSQLAsync 方法触发 AfterSelect 事件。
这些方法返回的列表包含查询匹配的每一行的行元素列表。
行元素列表中的元素取决于 ReturnColumnNames 属性。
当此属性为 true 时,行元素列表中的元素本身就是列表,每个列表包含两个元素:列名和列值。当此属性为 false 时,行元素列表中的元素是列值,其顺序与 SELECT 查询中请求的列相同。
这些方法执行带有可选绑定参数的 SQL SELECT 语句,该语句返回包含零行或多行数据的列表。
有关详细信息,请参阅下面有关 绑定参数 的部分。
这是一种便捷方法,无需构建整个 SQL 语句。可以提供列名列表和各种查询子句来简化调用。
有关返回列表的说明,请参阅 SelectSQL 方法。
这些方法执行 SQL INSERT 语句,返回插入行的唯一行 ID。
这些方法从文件中批量插入 CSV 格式的数据。
文件中的第一个非空行应该是目标表中要插入值的列名的逗号分隔列表。第二行和后续的非空行应该是值列表的逗号分隔列表。
这些行中的每一行都将导致在目标表中插入一个新行。
通过使用“\”作为断行中的最后一个字符,还支持行延续。文字字符串“\n”将被替换为实际换行符。
执行在第一个错误处停止。这些方法返回成功插入的行数。
文件名前缀“//”指定应用资产中的文件。
文件名前缀“/”指定外部 SD 卡上的文件。
无前缀指定相对于应用私有存储的路径。
建议在事务内使用这些方法,因为它们可能导致在发生错误时部分执行。通常,您希望文件中的所有语句都能起作用,或者根本不起作用。
这些方法执行 SQL REPLACE 语句,该语句返回插入或更新行的唯一行 ID。
SQL REPLACE 语句的意思是“如果不存在则插入,如果存在则更新”。
这些方法执行带有可选绑定参数的 SQL UPDATE 语句,该语句返回更新的行数。
有关更多信息,请参阅下面有关 绑定参数 的部分。
这些方法执行带有可选绑定参数的 SQL DELETE 语句,该语句返回已删除的行数。如果没有提供 whereClause(表示“删除所有行”),则返回零。
有关更多信息,请参阅下面有关 绑定参数 的部分。
绑定参数
上面的许多方法都包含 whereClause 和 bindParams 参数。这些参数结合在一起,提供了一种简单的方法来限制操作的行并防止 SQL 注入攻击。这个想法很简单。
whereClause 是一个 SQL WHERE 子句形式的字符串,没有单词“WHERE”。在数据库引擎执行语句之前,whereClause 中的任何问号都会自动替换为 bindParams 列表中的相应值。数据库引擎会根据需要处理这些值的转义。这允许开发人员跳过使用连接构建复杂的 whereClause 字符串。
例如,假设我们想从表中选择行,如下所示:
SELECT * FROM myTable WHERE name = 'Unknown' AND catCount > 10
此 SQL 语句中的 WHERE 子句是:
name = 'Unknown' AND catCount > 10
我们可以通过传入如下 whereClause 来完成同样的事情:
name = ? AND catCount > ?
以及如下的 bindParams 列表:
("Unknown", 10)