【问题标题】:Android SQLite syntax error near "," On API 21<“,”附近的Android SQLite语法错误API 21<
【发布时间】:2020-07-27 16:39:34
【问题描述】:

android.database.sqlite.SQLiteException: near ",": syntax error (code 1): , while compile:

从 order_details 中选择 transaction_detail_outlet_id LEFT OUTER JOIN 帐户 ON order_details.account_id = accounts._id AND account.account_name = 'asset1andriodx' 左外连接仓库_skunits_inventory ON order_details.transaction_detail_skunit_id = 仓库_skunits_inventory.skunit_id AND order_details.transaction_detail_from_warehouse_id = 仓库_skunits_inventory.warehouse_id 左外连接(选择 * FROM 仓库_skunits_pricing 哪里(仓库id,skunit_id,skunit_batch_id, skunit_price_priority ) IN ( 选择 仓库id, skunit_id, skunit_batch_id, 最大(skunit_price_priority)AS skunit_price_priority 从 仓库_skunits_pricing 团体 通过仓库_id, skunit_id, skunit_batch_id)) 作为 仓库_skunits_pricing 在 order_details.transaction_detail_skunit_id = 仓库_skunits_pricing.skunit_id AND order_details.transaction_detail_from_warehouse_id = 仓库_skunits_pricing.warehouse_id 左外连接 在 order_details.transaction_detail_skunit_id = skunits.skunit_id LEFT OUTER JOIN 折扣 ON order_details.transaction_detail_skunit_id = discounts.discount_skunit_id AND order_details.transaction_detail_outlet_id = discounts.discount_outlet_id 左外连接 form_type ON order_details.transaction_detail_skunit_id = form_type.form_type_type_id AND form_type.form_type_form_type = 'skunits_order' 左外连接 outlet_targets ON order_details.transaction_detail_outlet_id = outlet_targets.outlet_targets_outlet_id AND order_details.transaction_detail_skunit_id = outlet_targets.outlet_targets_skunit_id 左外连接批次 ON 仓库_skunits_inventory.skunit_id = batches.batch_skunit_id AND 仓库skunits_inventory.skunit_batch_id = batches.batch_id WHERE (transaction_detail_draft = '0' 或 transaction_detail_draft = '2' )

一旦我们在 android 版本

在之前的应用程序中,我们使用了 sqlcipher,我们现在将其删除,结果发现 sqlcipher 有它自己的语法格式,因此它不会对旧设备造成任何问题.

对于不同版本的android,sqlite 是否有不同的语法。因为 sqlite 库已经更新(“androidx.sqlite:sqlite:2.1.0”),它也应该支持旧设备的 db 引擎。(或者它是如何基于 android 版本工作的)

我已将所有双引号“字符串”查询更新为“单”引号,这是我在试验时发现的一种语法变化。

是否有任何简单的解决方案可以在所有 android 设备中支持相同的语法?

【问题讨论】:

标签: android sqlite android-sqlite


【解决方案1】:

Row Values 自版本 3.15.0 起在 SQLite 中受支持。
这是使用行值的代码部分:

WHERE (warehouse_id, skunit_id, skunit_batch_id, skunit_price_priority ) IN (....)

一种解决方法是使用连接:

SELECT transaction_detail_outlet_id 
FROM order_details 
LEFT OUTER JOIN accounts 
     ON order_details.account_id = accounts._id 
     AND accounts.account_name = 'asset1andriodx' 
LEFT OUTER JOIN warehouse_skunits_inventory 
     ON order_details.transaction_detail_skunit_id = warehouse_skunits_inventory.skunit_id 
     AND order_details.transaction_detail_from_warehouse_id = warehouse_skunits_inventory.warehouse_id 
LEFT OUTER JOIN (
  SELECT w.* 
  FROM warehouse_skunits_pricing w
  INNER JOIN ( 
    SELECT warehouse_id, skunit_id, skunit_batch_id, Max(skunit_price_priority) AS skunit_price_priority 
    FROM warehouse_skunits_pricing 
    GROUP BY warehouse_id, skunit_id, skunit_batch_id
  ) t 
  ON t.warehouse_id = w.warehouse_id AND t.skunit_id = w.skunit_id AND t.skunit_batch_id = w.skunit_batch_id AND t.skunit_price_priority = w.skunit_price_priority
) AS warehouse_skunits_pricing 
      ON order_details.transaction_detail_skunit_id = warehouse_skunits_pricing.skunit_id 
      AND order_details.transaction_detail_from_warehouse_id = warehouse_skunits_pricing.warehouse_id 
LEFT OUTER JOIN skunits 
     ON order_details.transaction_detail_skunit_id = skunits.skunit_id 
LEFT OUTER JOIN discounts 
     ON order_details.transaction_detail_skunit_id = discounts.discount_skunit_id 
     AND order_details.transaction_detail_outlet_id = discounts.discount_outlet_id 
LEFT OUTER JOIN form_type 
     ON order_details.transaction_detail_skunit_id = form_type.form_type_type_id 
     AND form_type.form_type_form_type = 'skunits_order' 
LEFT OUTER JOIN outlet_targets 
     ON order_details.transaction_detail_outlet_id = outlet_targets.outlet_targets_outlet_id 
     AND order_details.transaction_detail_skunit_id = outlet_targets.outlet_targets_skunit_id 
LEFT OUTER JOIN batches 
     ON warehouse_skunits_inventory.skunit_id = batches.batch_skunit_id 
     AND warehouse_skunits_inventory.skunit_batch_id = batches.batch_id 
WHERE (transaction_detail_draft = '0' OR transaction_detail_draft = '2')

希望我没有错别字。

【讨论】:

  • 您好 forpas.. 感谢您的快速反馈。问题不在于这个单一的查询。在我们的应用程序中,我们有许多不同的查询开始抛出上述错误。我正在寻找为什么这在 sqlite 3.8 (android 5
  • 上述查询只是一个示例。
  • 我的回答是关于您在问题中发布的代码。
  • 赞成一些建议,确实,这个单独的查询在做出您建议的更改后已修复。
  • 回答您的问题有没有简单的解决方案可以在所有安卓设备中支持相同的语法?不,没有。您必须仅使用您的应用将运行的最低版本设备支持的 SQLite 功能。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多