无法从JOINed表

时间:2018-06-18 13:46:11

标签: java android sql android-sqlite

应用应该做什么

该应用是一个测验应用,多选4个可能的答案(只有1个是正确的),具有多个难度级别和一些问题类别。

我有一个有问题的表,一个有答案的表和一个有难度级别的表,我与我不再联系的人共同开发了(他做了SQL和数据库工作,这就是为什么我挣扎着)。 有几种测验模式,但对于这个问题,让我们专注于标准'测验模式(例如Easy,Medium,Hard,根据难度级别加载问题,并且工作完美)和“定制”模式。模式(在测验开始之前,用户选择了一个或多个类别,这些类别不起作用)。

获取标准测验模式答案的工作代码如下 - 再次,这有效:

                cursor = getReadableDatabase().rawQuery(
                    String.format(
                            "SELECT a.%s %s, question_id, a.text text, is_correct " +
                                    "FROM %s a JOIN %s q ON a.question_id = q.%s " +
                                    "JOIN %s l ON q.level_id = l.%s WHERE l.level = ? AND q.is_active = 1",
                            BaseColumns._ID, BaseColumns._ID,
                            ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID,
                            LEVELS_TABLE_NAME, BaseColumns._ID
                    ),
                    new String[]{Integer.toString(level)}

我的问题

以下是获取自定义测验模式答案的代码。让我们说用户选择测验类别'历史记录'和'技术' (甚至只是其中一个类别)。当我运行此特定查询时,测验加载正常,但没有显示答案:

        cursor = getReadableDatabase().rawQuery(
                String.format(
                        "SELECT a.%s %s, question_id, a.text text, is_correct " +
                                "FROM %s a JOIN %s q ON a.question_id = q.%s WHERE q.category = ? AND q.is_active = 1 ",
                        BaseColumns._ID, BaseColumns._ID,
                        ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
                ),
                new String[]{thisQuestionCategory});

更多信息

我很高兴发布有关数据库或应用程序的任何信息(表格,列名,Java代码等,请问 - 我不想立即将其全部转储)。

数据库/表格信息

根据要求,有关表格的一些信息:

List of tables

Once item from the questions table

One item from the answers table

最后

我知道我的其余代码可能存在缺陷导致此问题,但SQL查询似乎是最好的起点,因为它是我最不熟悉的领域。我已经完成了其余代码的逻辑,没有发现任何问题,但如果我们无法发现SQL的任何问题,我可以发布Java代码,以便您可以看到应用程序如何结合在一起。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

考虑以下示例表: -

enter image description here

enter image description here

  • 请注意, id 列已命名为 _id ,以反映Base.Columns._ID解析为的值(即_id不是根据您的屏幕截图ID)。< / LI>

您的SQL将解析为(假设通过thisQuestionCategory传递的类别为 HISTORY ): -

SELECT a._id _id, question_id, a.text text, is_correct 
FROM quiz_answers a
JOIN quiz_questions q ON a.question_id = q._id 
WHERE q.category = 'HISTORY' AND q.is_active = 1
;

然后结果将是: -

enter image description here

即。功能上似乎没有任何问题。

您可以添加如下内容: -

Log.d("CURSORINFO",String.valueOf(cursor.getCount())+ " rows were extracted.");

然后运行并检查日志以查看正在提取的行数。

  • 如果该数字大于0,那么您的问题就在其他地方(稍后)。
  • 如果数字为0,请尝试删除where子句(例如下面的代码)并重新运行。如果仍然检索0行,那么很可能没有连接数据。即要包括答案,它必须引用一个问题。

        cursor = this.getReadableDatabase().rawQuery(
            String.format(
                    "SELECT a.%s %s, question_id, a.text text, is_correct " +
                            "FROM %s a JOIN %s q ON a.question_id = q.%s",
                    BaseColumns._ID, BaseColumns._ID,
                    ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
            ), null);