BuildUnionQuery中的SQLite rawQuery只选择第一个真实条件

时间:2016-01-16 19:44:12

标签: android sqlite android-sqlite

我在Android Studio中有以下代码

String[] buildquery={
            "SELECT anatomia FROM "+usuariosinfodbh.tablausuarioname+" WHERE anatomia='si' AND usuario='"+nombre+"';",
            "SELECT bioquimica FROM "+usuariosinfodbh.tablausuarioname+" WHERE bioquimica='si' AND usuario='"+nombre+"';",
            "SELECT histologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE histologia='si' AND usuario='"+nombre+"';",
            "SELECT fisiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiologia='si' AND usuario='"+nombre+"';",
            "SELECT embriologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE embriologia='si' AND usuario='"+nombre+"';",
            "SELECT microbiologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE microbiologia='si' AND usuario='"+nombre+"';",
            "SELECT urgencias FROM "+usuariosinfodbh.tablausuarioname+" WHERE urgencias='si' AND usuario='"+nombre+"';",
            "SELECT farmacologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE farmacologia='si';",
            "SELECT nutricion FROM "+usuariosinfodbh.tablausuarioname+" WHERE nutricion='si' AND usuario='"+nombre+"';",
            "SELECT patologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE patologia='si' AND usuario='"+nombre+"';",
            "SELECT fisiopatologia FROM "+usuariosinfodbh.tablausuarioname+" WHERE fisiopatologia='si' AND usuario='"+nombre+"';"
    };
    SQLiteQueryBuilder qb=new SQLiteQueryBuilder();
    String query=qb.buildUnionQuery(buildquery, null, null);
    Cursor c= db.rawQuery(query, null);

当我使用相关的Log.d运行它以知道选择了多少列时,它只显示1,这是满足条件的第一列(在这种情况下是anatomia ='si') 。我知道这是第一个因为如果我删除SELECT ...其中anatomia ='si',那么Log.d打印nutricion ='si',这是下一个条件是真的。 我希望这段代码选择我设置的条件满足的所有列,而不仅仅是满足它的第一列。 先感谢您。 PS:我正在使用的(Log.d)是:

Log.d("countcolumsreg", Integer.toString(c.getCount()));//0
    Log.d("countcolumns", Integer.toString(c.getColumnCount()));//0

String[] usuariomaterias= new String[c.getColumnCount()];    
for (int i=0; i<c.getColumnCount();i++) {
        usuariomaterias[i] = c.getColumnName(i);
        Log.d("arrayseg",usuariomaterias[i]); //anatomia
    }

1 个答案:

答案 0 :(得分:1)

这是UNION的作用:它执行一堆查询,并将每个查询的结果合并到一个结果集中。使用UNION而不使用ALL修饰符时,会删除重复的行。这就是为什么您只获得一行 - 所有匹配的行只包含'si',因此它们都是重复的。

附注:为了防止SQL注入攻击,您应始终使用?占位符的查询,在{{selectionArgs的情况下,在单独的值数组中提供参数(第二个参数rawQuery() 1}})。

我不确定,但似乎你想知道是否有一个&#39; si&#39;在每一栏中。这里有一个替代方案,为每个人提供一个真/假:

SELECT
  anatomia='si' AS anatomia,
  bioquimica='si' AS bioquimica,
  histologia='si' AS histologia,
  ...
FROM yourtable
WHERE usuario=?

这会给你一个类似于:

的结果
anatomia bioquimica histologia ...
       1          0          1 ...

但是,也许你应该考虑改变你的表格设计来制作列BOOLEAN - 因为&#39; si&#39;真的听起来像一个布尔值。这样,您基本上可以SELECT * FROM...或至少SELECT anatomia, bioquimica, histologia... FROM...,从而使您的代码更漂亮。 :)

@LuisE回复评论后更新:

将列视为&#34;数据&#34;并不是一种非常方便的方法。在SQL中。我能想到的最好的选择是(假设我们已经从&#39; si&#39;变为实际的布尔值):

SELECT 'anatomia' FROM yourtable WHERE usuario=?1 AND anatomia
UNION SELECT 'bioquimica' FROM yourtable WHERE usuario=?1 AND bioquimica
UNION SELECT 'histologia' FROM yourtable WHERE usuario=?1 AND histologia
...

但正如您所看到的,仍然需要一堆非常相似的SELECT。不是很漂亮。

顺便说一句,通过这一切,我假设usuario是唯一的(PRIMARY KEYUNIQUE)。