首页 > 解决方案 > 我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗?

问题描述

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

标签: androidsqlsql-serversqliteandroid-sqlite

解决方案


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

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

JOINS 作为不兼容的一个例子,没有 RIGHT JOIN 所有的连接都是 LEFT 在 SQLite 中,所以你需要反转 RIGHT JOIN。

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

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

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

  • 例如在http://sqlfiddle.com/#!7/9eecb7/8070

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

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

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

简而言之,在 SQLite 中,列定义是显式或隐式的(但完全是整数,而不是 INT 或 PINT (具有 INTEGER 亲和性) ......):- column_name INTEGER PRIMARY KEY,通常会单调递增(并带有调整(插入 - 数字)可以滚动到负数(整数是 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 版本 另一个考虑因素是不同版本的 Android 有不同版本的 SQLite,因此最低级别的 Android 目标可能决定哪些 SQL 可以使用或不能使用。

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


推荐阅读