我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]

Posted

技术标签:

【中文标题】我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]【英文标题】:Can we use all SQL queries and functions on SQLite database in Android? [closed] 【发布时间】:2021-08-10 02:00:43 【问题描述】:

我在 SQL Server 上有一个数据库,其中包含近 40 个表。这些表中包含主键、外键和复合键。除了执行时间之外,我还使用了多个复杂的查询,这些查询使用了连接和函数以及其他 SQL 参数。我想知道所有适用于 SQL Server 的查询也适用于在 android 上运行的 SQLite?谢谢

【问题讨论】:

归根结底,SQL Server 和 SQLite 是两个完全不同的数据库引擎。虽然它们可能共享许多常见的 ANSI SQL,但它们之间也存在差异。鉴于我们不知道您在代码中使用了哪些功能,因此我们无能为力。您需要进行研究,找出这两个引擎之间的差异,然后看看您是否使用了这些功能。 【参考方案1】:

我想知道所有适用于 SQL server 的查询也适用于在 android 上运行的 SQLite?

我建议确定这一点的最佳方法是使用一种可用的 SQLite 工具(例如 DBBeaver、Navicat for SQLite)进行测试。

加入 作为不兼容的示例,没有 RIGHT JOIN 所有连接在 SQLite 中都是 LEFT,因此您需要反转 RIGHT JOIN。

根据https://sqlite.org/syntax/join-operator.html

列类型 在其他一些方面,SQLite 不仅仅是好客的,例如列类型,除了一个例外,行/列可以存储任何受支持的类型(NULL、INTEGER、TEXT、REAL、BLOB、NUMERIC),您实际上可以指定几乎任何列输入例如any_old_column_type 作为列类型有效。

NUMERIC 是一个统称,因为通过一些基本规则未确定为任何其他类型的列类型是数字 any_old_column_type 将具有 NUMERIC 的类型亲和性作为示例。并不是那种类型的亲和性经常是一个值得关注的问题。

http://sqlfiddle.com/#!7/9eecb7/8070 的示例

我相信 SQL Server 有一个 DATE 类型,SQLite 没有,但可以处理存储为整数、字符串、实数或数字的日期

见https://sqlite.org/lang_datefunc.html

您可能必须警惕空值,因为您永远不应该使用 = null(因为没有空值与另一个空值相同),而应该使用 IS null 或 IS NOT null。 (不确定 SQL Server)。

您不妨考虑https://www.sqlite.org/datatype3.html

自动递增 您可能会遇到的另一个区别是自动递增标识符。

简而言之,SQLite 中的列定义是显式或隐式的(但 EXACTLY INTEGER 而不是 INT 或 PINT (具有 INTEGER 亲和力) ....) :- column_name INTEGER PRIMARY KEY,通常会单调递增(并且通过调整(插入 - 数字)可以滚动到负数(INTEGER 是 64 位签名的))但不能保证它是单调的。

通常假设关键字 AUTOINCREMENT 来定义此操作。但是,AUTOINCREMENT 所做的是保证该值将大于任何使用的值(或者如果 ID 超过 9223372036854775807,则失败并出现 SQLITE FULL 错误,而没有 AUTOINCREMENT 较低的“免费” id 可能会被返回(很可能因为 9223372036854775807 id 不太可能存储数据)。

负调整不能用于 AUTOINCREMENT

ROWID 总是有这样的列(除非 WITHOUT ROWID),但它通常是隐藏的,它可以称为 rowid、rowid 或 oid。 column_name INTEGER PRIMARY KEY(带或不带 AUTOINCREMENT)使列成为 rowid 的别名。

见https://sqlite.org/autoinc.html

也许请注意,除非必要,否则不建议使用 AUTOINCREMENT,因为它有开销(表 sqlite_sequence,其中根据表的名称存储提供的最高 id)。

安卓版 另一个考虑因素是不同版本的 Android 有不同版本的 SQLite,因此最低级别的 Android 目标可能决定哪些 SQL 可以使用或不能使用。

其中一个问题可能是使用 OVER 关键字的 Windows 函数。只有 Android API 30+ 才有这样的功能。

【讨论】:

IS nullIS NOT null 适用于 SQL Server。这就是 ANSI 标准。

以上是关于我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]

Android SQLite 的介绍和使用

SQLite在Android程序中的使用方法,SQLite的增删查改方法

Android学习总结(十八) ———— SQLite数据库使用

Android数据库代码优化 - 从SQLite说起

不理解?为啥我们在“Android Sqlite”中需要 BLOB