在sqlite查询中如何获取具有所需值的特定行和列

时间:2014-05-30 07:07:34

标签: android sqlite android-cursor

我正在尝试构建一个测验应用程序,数据库中的条目看起来像这样

id | term | synonym 1 | synonym 1 answered | synonym 2 | synonym 2 answered | ....
----------------------------------------------------------------------------------
1  | read | recite    |       Yes          | study     |     No             |
2  | work | effort    |       No           | labour    |     Yes            |

这个想法是一次提出一个同义词。选择下一个同义词后,使用"是"

同义词旁边的列将前一个同义词标记为已回答。

对于选择单词的逻辑,我使用Collection.shuffle()函数来获取随机行和随机列,查询数据库以查看其已回答列是否为"否"。如果"是"我正在重复洗牌,直到我得到一个" No"。

要知道整个表中至少有一个条目是否有"否"在任何一个回答的'列,我对已回答的列使用OR子句(以确保所有同义词都没有被回答)

所以我的应用程序正在进行大量迭代以获得所需的单词,这绝对是非常糟糕的方式。

我无法想办法让sqlite查询返回一个随机的行和列,其中包含单词" No"。如果我可以获得具有" No"的结果的列名称,我可以删除单词'已回答'并连续获取相关的同义词列,并将其与大部分Java代码一起呈现。

任何人都可以赐予我这个并给出解决方案吗?我需要一个单词" No"的结果匹配的列名和rowid。在整个表格中。它一定是随机的

编辑: 这里给出的场景是为了简单起见。实际的应用程序处理梵语语法,需要我正在计划的实现类型。我要求得到这个名字'列和' id'得到一个' No'的行。在实施中,我不会使用'是'并且没有'。所有条款的列数都是固定的。为简单起见,我举了这个例子。

2 个答案:

答案 0 :(得分:1)

我会推荐以下内容:

首先规范化您的表格结构。将有两个表格:TermsSynonyms

Terms表格将包含IdTermName

Synonyms表中,SynonymIdNameAnswered TermId因此,您可以在此处通过TermId跟踪同义词。

通过这种方式,您可以轻松查询以查找特定术语仍然无法解答的同义词,如:

SELECT * FROM Synomyms WHERE TermId = 1 AND Answered = "No"

希望这有帮助

答案 1 :(得分:0)

嗯,是/否的部分有点乏味,特别是如果你这样做(对我来说,另一个关系表会更有意义,但这是另一个故事)。

SELECT * 
FROM table 
WHERE 
    synonym_1_answered = 'No' 
    OR synonym_2_answered = 'No' 
    OR ...
ORDER BY RANDOM() LIMIT 1;

使用"No"使用where过滤掉random,并使用Long long = cursor.getLong(cursor.getColumnIndex("long")); boolean is_synonym_1_answered = cursor.getString( cursor.getColumnIndex("synonym_1_answered") ).equals('Yes'); boolean is_synonym_2_answered = cursor.getString( cursor.getColumnIndex("synonym_2_answered") ).equals('Yes'); ... 功能进行排序"排序" (更像是unsort)他们。

编辑:

完成数据选择后,如果您有一个指向此结果的光标,它就像以下一样简单:

ID

之后,您只需要检查哪个布尔值是否定的,因此该同义词还没有被回答。您可以通过将查询的位置存储在常量中来加快速度(因此TERM为0,Long long = cursor.getLong(ID); boolean is_synonym_1_answered = cursor.getString(SYNONYM_1_ANS).equals('Yes'); boolean is_synonym_2_answered = cursor.getString(SYNONYM_2_ANS).equals('Yes'); ... 为1 ...典型情况是将它们存储在数组中)。这样你就不会浪费时间向光标询问列的位置:

{{1}}

同样,为了加快速度,第二个表只包含同义词和对原始术语的引用会使事情变得更容易(因为查询返回的每一行都是未经检查的同义词)。