我们可以在 Android 的 SQLite 数据库上使用所有 SQL 查询和函数吗?
Can we use all SQL queries and functions on SQLite database in Android?
我在 SQL 服务器上有一个数据库,其中包含将近 40 个表。这些表中有主键、外键和复合键。除了执行时间之外,我还使用了多个复杂的查询,这些查询使用连接和函数以及其他 SQL 参数。我想知道适用于 SQL 服务器的所有查询也适用于 Android 上的 SQLite 运行?谢谢
I want to know that all the queries which are applicable on SQL server are also applicable on SQLite running on android?
我建议确定这一点的最佳方法是使用一种可用的 SQLite 工具(例如 DBBeaver、SQLite 的 Navicat)进行测试。
加入
作为不兼容的一个例子,在 SQLite 中没有 RIGHT JOIN 所有连接都是 LEFT,因此您需要反转 RIGHT JOIN。
根据https://sqlite.org/syntax/join-operator.html
列类型
在其他一些方面 SQLite 比 hospitable 更重要,例如列类型,除了一个例外 row/column 可以存储任何支持的类型(NULL、INTEGER、TEXT、REAL、 BLOB, NUMERIC) 并且您实际上可以指定几乎任何列类型,例如any_old_column_type 作为列类型有效。
NUMERIC 是一个包罗万象的东西,因为通过一些基本规则没有确定为任何其他类型的列类型是数字 any_old_column_type例如,将具有 NUMERIC 的类型亲和力。并不是说类型亲和力经常是一个值得关注的问题。
-
我相信 SQL 服务器有 DATE 类型 SQLite 没有但可以处理存储为整数、字符串、实数或数字的日期
您可能必须警惕空值,因为您永远不应使用 = null(因为没有空值与另一个空值相同),而应该使用 IS null 或 IS NOT null。 (不确定 SQL 服务器)。
自动递增
您可能会遇到的另一个区别是自动递增标识符。
简而言之,在 SQLite 中明确或隐含地列定义(但 EXACTLY INTEGER 而不是 INT 或 PINT (这将有INTEGER affinity) ....):- 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 的别名。
-
也许请注意,除非必要,否则不建议使用 AUTOINCREMENT,因为它有开销(table sqlite_sequence,其中提供的最高 ID 根据 table的名字)。
Android版本
另一个考虑是不同版本的 Android 有不同版本的 SQLite,因此最低级别的 Android 目标可能决定什么 SQL 可以或不能使用。
其中一个问题可能是 Windows 使用 OVER 关键字的函数。只有Android API 30+有这样的功能。
我在 SQL 服务器上有一个数据库,其中包含将近 40 个表。这些表中有主键、外键和复合键。除了执行时间之外,我还使用了多个复杂的查询,这些查询使用连接和函数以及其他 SQL 参数。我想知道适用于 SQL 服务器的所有查询也适用于 Android 上的 SQLite 运行?谢谢
I want to know that all the queries which are applicable on SQL server are also applicable on SQLite running on android?
我建议确定这一点的最佳方法是使用一种可用的 SQLite 工具(例如 DBBeaver、SQLite 的 Navicat)进行测试。
加入 作为不兼容的一个例子,在 SQLite 中没有 RIGHT JOIN 所有连接都是 LEFT,因此您需要反转 RIGHT JOIN。
根据https://sqlite.org/syntax/join-operator.html
列类型 在其他一些方面 SQLite 比 hospitable 更重要,例如列类型,除了一个例外 row/column 可以存储任何支持的类型(NULL、INTEGER、TEXT、REAL、 BLOB, NUMERIC) 并且您实际上可以指定几乎任何列类型,例如any_old_column_type 作为列类型有效。
NUMERIC 是一个包罗万象的东西,因为通过一些基本规则没有确定为任何其他类型的列类型是数字 any_old_column_type例如,将具有 NUMERIC 的类型亲和力。并不是说类型亲和力经常是一个值得关注的问题。
我相信 SQL 服务器有 DATE 类型 SQLite 没有但可以处理存储为整数、字符串、实数或数字的日期
您可能必须警惕空值,因为您永远不应使用 = null(因为没有空值与另一个空值相同),而应该使用 IS null 或 IS NOT null。 (不确定 SQL 服务器)。
自动递增 您可能会遇到的另一个区别是自动递增标识符。
简而言之,在 SQLite 中明确或隐含地列定义(但 EXACTLY INTEGER 而不是 INT 或 PINT (这将有INTEGER affinity) ....):- 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 的别名。也许请注意,除非必要,否则不建议使用 AUTOINCREMENT,因为它有开销(table sqlite_sequence,其中提供的最高 ID 根据 table的名字)。
Android版本 另一个考虑是不同版本的 Android 有不同版本的 SQLite,因此最低级别的 Android 目标可能决定什么 SQL 可以或不能使用。
其中一个问题可能是 Windows 使用 OVER 关键字的函数。只有Android API 30+有这样的功能。