首页 > 解决方案 > 为什么这个 SQLite 查询在 AS3 AIR (Android) 项目中不起作用?

问题描述

试图在这里问,希望至少有一个AS3/AIR程序员剩余并且AIR还没有完全死去......:我有一个使用AndroidAS3编译的项目(关于酒瓶) ,其中包含一个小型数据库(少于1000行)和我需要运行此查询(在所选参数中查找相同瓶子的组,然后将它们返回到源表以获取其余行,通过on减少重复项并分别对满瓶和空瓶执行所有这些操作,将它们重新组合成一个结果使用):Adobe (Harman) AIRSQLiteINNER JOINingGROUPingx.itemsUNION ALL

SELECT b.vinoID,
       b.vinoteka,
       b.jmeno,
       b.typ,
       b.rocnik,
       b.jakost,
       b.kategorie,
       b.zeme,
       b.vinar,
       b.dateIn,
       b.dateOut,
       b.hodnoceni,
       x.pocet,
       x.items
  FROM (
           SELECT barcode,
                  jmeno,
                  odruda,
                  typ,
                  rocnik,
                  jakost,
                  alkohol,
                  objem,
                  kategorie,
                  cukr,
                  kyseliny,
                  zeme,
                  oblast,
                  podoblast,
                  obec,
                  trat,
                  vinar,
                  max(dateIn) AS dateIn,
                  count(vinoID) AS pocet,
                  group_concat(vinoID) AS items
             FROM _bottles
            WHERE dateOut IS NULL AND barcode = '8595004640052'
            GROUP BY barcode,
                     jmeno,
                     odruda,
                     typ,
                     rocnik,
                     jakost,
                     alkohol,
                     objem,
                     kategorie,
                     cukr,
                     kyseliny,
                     zeme,
                     oblast,
                     podoblast,
                     obec,
                     trat,
                     vinar
       )
       AS x
       INNER JOIN
       _bottles AS b ON (x.barcode = b.barcode OR (x.barcode IS NULL AND b.barcode IS NULL) ) AND 
                        x.jmeno = b.jmeno AND 
                        (x.odruda = b.odruda OR (x.odruda IS NULL AND b.odruda IS NULL) ) AND 
                        x.typ = b.typ AND 
                        x.rocnik = b.rocnik AND 
                        (x.jakost = b.jakost OR (x.jakost IS NULL AND b.jakost IS NULL) ) AND 
                        x.alkohol = b.alkohol AND 
                        x.objem = b.objem AND 
                        (x.kategorie = b.kategorie OR (x.kategorie IS NULL AND b.kategorie IS NULL) ) AND 
                        x.cukr = b.cukr AND 
                        x.kyseliny = b.kyseliny AND 
                        (x.zeme = b.zeme OR (x.zeme IS NULL AND b.zeme IS NULL) ) AND 
                        (x.oblast = b.oblast OR (x.oblast IS NULL AND b.oblast IS NULL) ) AND 
                        (x.podoblast = b.podoblast OR (x.podoblast IS NULL AND b.podoblast IS NULL) ) AND 
                        (x.obec = b.obec OR (x.obec IS NULL AND b.obec IS NULL) ) AND                        
                        (x.trat = b.trat OR (x.trat IS NULL AND b.trat IS NULL) ) AND 
                        (x.vinar = b.vinar OR (x.vinar IS NULL AND b.vinar IS NULL) ) AND 
                        x.dateIn = b.dateIn AND 
                        b.dateOut IS NULL
  GROUP BY x.items
UNION ALL
SELECT b.vinoID,
       b.vinoteka,
       b.jmeno,
       b.typ,
       b.rocnik,
       b.jakost,
       b.kategorie,
       b.zeme,
       b.vinar,
       b.dateIn,
       b.dateOut,
       b.hodnoceni,
       x.pocet,
       x.items
  FROM (
           SELECT barcode,
                  jmeno,
                  odruda,
                  typ,
                  rocnik,
                  jakost,
                  alkohol,
                  objem,
                  kategorie,
                  cukr,
                  kyseliny,
                  zeme,
                  oblast,
                  podoblast,
                  obec,
                  trat,
                  vinar,
                  max(dateOut) AS dateOut,
                  count(vinoID) AS pocet,
                  group_concat(vinoID) AS items
             FROM _bottles
            WHERE dateOut IS NOT NULL AND barcode = '8595004640052'
            GROUP BY barcode,
                     jmeno,
                     odruda,
                     typ,
                     rocnik,
                     jakost,
                     alkohol,
                     objem,
                     kategorie,
                     cukr,
                     kyseliny,
                     zeme,
                     oblast,
                     podoblast,
                     obec,
                     trat,
                     vinar
       )
       AS x
       INNER JOIN
       _bottles AS b ON (x.barcode = b.barcode OR (x.barcode IS NULL AND b.barcode IS NULL) ) AND 
                        x.jmeno = b.jmeno AND 
                        (x.odruda = b.odruda OR (x.odruda IS NULL AND b.odruda IS NULL) ) AND 
                        x.typ = b.typ AND 
                        x.rocnik = b.rocnik AND 
                        (x.jakost = b.jakost OR (x.jakost IS NULL AND b.jakost IS NULL) ) AND 
                        x.alkohol = b.alkohol AND 
                        x.objem = b.objem AND 
                        (x.kategorie = b.kategorie OR (x.kategorie IS NULL AND b.kategorie IS NULL) ) AND 
                        x.cukr = b.cukr AND 
                        x.kyseliny = b.kyseliny AND 
                        (x.zeme = b.zeme OR (x.zeme IS NULL AND b.zeme IS NULL) ) AND 
                        (x.oblast = b.oblast OR (x.oblast IS NULL AND b.oblast IS NULL) ) AND 
                        (x.podoblast = b.podoblast OR (x.podoblast IS NULL AND b.podoblast IS NULL) ) AND 
                        (x.obec = b.obec OR (x.obec IS NULL AND b.obec IS NULL) ) AND 
                        (x.trat = b.trat OR (x.trat IS NULL AND b.trat IS NULL) ) AND 
                        (x.vinar = b.vinar OR (x.vinar IS NULL AND b.vinar IS NULL) ) AND 
                        x.dateOut = b.dateOut
 GROUP BY x.items
 ORDER BY b.dateOut DESC

一如既往地以缩小形式将此查询提供给 SQLstatement 对象的文本属性(我在项目中有一些其他更简单的查询,它们工作正常)。:

bottlesCode.text = "SELECT b.vinoID, b.vinoteka, b.jmeno, b.typ, b.rocnik, b.jakost, b.kategorie, b.zeme, b.vinar, b.dateIn, b.dateOut, b.hodnoceni, x.pocet, x.items " +
                                    "FROM (SELECT barcode, jmeno, odruda, typ, rocnik, jakost, alkohol, objem, kategorie, cukr, kyseliny, zeme, oblast, podoblast, obec, trat, vinar, max(dateIn) AS dateIn, count(vinoID) AS pocet, group_concat(vinoID) AS items " +
                                    "FROM _bottles WHERE dateOut IS NULL AND barcode='8595004640052' GROUP BY barcode, jmeno, odruda, typ, rocnik, jakost, alkohol, objem, kategorie, cukr, kyseliny, zeme, oblast, podoblast, obec, trat, vinar) " +
                                    "AS x INNER JOIN _bottles AS b ON (x.barcode = b.barcode OR (x.barcode IS NULL AND b.barcode IS NULL)) " +
                                    "AND x.jmeno = b.jmeno AND (x.odruda = b.odruda OR (x.odruda IS NULL AND b.odruda IS NULL)) AND x.typ = b.typ AND x.rocnik = b.rocnik AND (x.jakost = b.jakost OR (x.jakost IS NULL AND b.jakost IS NULL)) " +
                                    "AND x.alkohol = b.alkohol AND x.objem = b.objem AND (x.kategorie = b.kategorie OR (x.kategorie IS NULL AND b.kategorie IS NULL)) AND x.cukr = b.cukr AND x.kyseliny = b.kyseliny AND (x.zeme = b.zeme OR (x.zeme IS NULL AND b.zeme IS NULL)) " +
                                    "AND (x.oblast = b.oblast OR (x.oblast IS NULL AND b.oblast IS NULL)) AND (x.podoblast = b.podoblast OR (x.podoblast IS NULL AND b.podoblast IS NULL)) AND (x.obec = b.obec OR (x.obec IS NULL AND b.obec IS NULL)) " +
                                    "AND (x.trat = b.trat OR (x.trat IS NULL AND b.trat IS NULL)) AND (x.vinar = b.vinar OR (x.vinar IS NULL AND b.vinar IS NULL)) AND x.dateIn = b.dateIn AND b.dateOut is NULL " +
                                    "GROUP BY x.items UNION ALL " +
                                    "SELECT b.vinoID, b.vinoteka, b.jmeno, b.typ, b.rocnik, b.jakost, b.kategorie, b.zeme, b.vinar, b.dateIn, b.dateOut, b.hodnoceni, x.pocet, x.items " +
                                    "FROM (SELECT barcode, jmeno, odruda, typ, rocnik, jakost, alkohol, objem, kategorie, cukr, kyseliny, zeme, oblast, podoblast, obec, trat, vinar, max(dateOut) AS dateOut, count(vinoID) AS pocet, group_concat(vinoID) AS items " +
                                    "FROM _bottles WHERE dateOut IS NOT NULL AND barcode='8595004640052' GROUP BY barcode, jmeno, odruda, typ, rocnik, jakost, alkohol, objem, kategorie, cukr, kyseliny, zeme, oblast, podoblast, obec, trat, vinar) AS x INNER JOIN _bottles AS b " +
                                    "ON (x.barcode = b.barcode OR (x.barcode IS NULL AND b.barcode IS NULL)) AND x.jmeno = b.jmeno AND (x.odruda = b.odruda OR (x.odruda IS NULL AND b.odruda IS NULL)) AND x.typ = b.typ AND x.rocnik = b.rocnik " +
                                    "AND (x.jakost = b.jakost OR (x.jakost IS NULL AND b.jakost IS NULL)) AND x.alkohol = b.alkohol AND x.objem = b.objem AND (x.kategorie = b.kategorie OR (x.kategorie IS NULL AND b.kategorie IS NULL)) " +
                                    "AND x.cukr = b.cukr AND x.kyseliny = b.kyseliny AND (x.zeme = b.zeme OR (x.zeme IS NULL AND b.zeme IS NULL)) AND (x.oblast = b.oblast OR (x.oblast IS NULL AND b.oblast IS NULL)) " +
                                    "AND (x.podoblast = b.podoblast OR (x.podoblast IS NULL AND b.podoblast IS NULL)) AND (x.obec = b.obec OR (x.obec IS NULL AND b.obec IS NULL)) AND (x.trat = b.trat OR (x.trat IS NULL AND b.trat IS NULL)) " +
                                    "AND (x.vinar = b.vinar OR (x.vinar IS NULL AND b.vinar IS NULL)) AND x.dateOut = b.dateOut " +
                                    "GROUP BY x.items " +
                                    "ORDER BY b.dateOut ASC";

现在我的问题是:当我在我的应用程序中运行这个查询时,我没有得到任何结果DB,没有错误,应用程序只是卡在这个上面。如果我在 PC 上使用 运行此查询SQLiteStudio,则一切正常(我在 ~ 20 毫秒内得到了所需的结果)。我在几个在线验证器中检查了这个查询,他们都说它有效。我还检查了在应用程序中处理它时查询字符串是否完整并且它是完整的。那么为什么它不起作用呢?我是否触及任何限制AS3 AIR(SQL 字符串长度、查询中的嵌套选择、......无论如何)或问题可能出在哪里?

忘了提一下,单独处理的两个部分(之前和之后UNION ALL)都可以正常工作,但在一个查询中一起处理却不行。

标签: androidsqliteactionscript-3air

解决方案


推荐阅读