Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从联接的表中获取正确的信息_Java_Android_Sql_Android Sqlite - Fatal编程技术网

Java 无法从联接的表中获取正确的信息

Java 无法从联接的表中获取正确的信息,java,android,sql,android-sqlite,Java,Android,Sql,Android Sqlite,应用程序应该做什么 该应用程序是一个问答应用程序,有4个可能的答案(只有1个是正确的),具有多个难度级别和多个问题类别 我有一个包含问题的表,一个包含答案的表,还有一个包含难度级别的表,这是我与一个不再接触的人共同开发的(他做了SQL和数据库工作,这就是为什么我在努力)。 有几种测验模式,但是对于这个问题,让我们集中讨论“标准”测验模式(例如简单、中等、困难,它根据难度水平加载问题,并且工作得很好)和“自定义”模式(对于这两种模式,用户在测验开始之前选择一个或多个类别,但不起作用) 获取标准测验

应用程序应该做什么

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

我有一个包含问题的表,一个包含答案的表,还有一个包含难度级别的表,这是我与一个不再接触的人共同开发的(他做了SQL和数据库工作,这就是为什么我在努力)。 有几种测验模式,但是对于这个问题,让我们集中讨论“标准”测验模式(例如简单、中等、困难,它根据难度水平加载问题,并且工作得很好)和“自定义”模式(对于这两种模式,用户在测验开始之前选择一个或多个类别,但不起作用)

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

                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代码等,请尽管问——我不想立即将其全部转储到这里)

数据库/表信息

根据要求,表中提供了一些信息:

最后


我知道我的其他代码可能有缺陷,导致这个问题,但SQL查询似乎是最好的开始,因为它是我最不熟悉的领域。我已经浏览了其余代码的逻辑,没有发现任何问题,但是如果我们不能发现SQL的任何问题,我可以发布Java代码,这样您就可以看到应用程序是如何结合在一起的。感谢您抽出时间。

考虑以下示例表:-

  • 注意,id列已命名为\u id,以反映
    Base.columns.\u id
    解析为的值(即,根据屏幕截图,\u id不是id)
并且您的SQL将解析为(假设通过thisQuestionCategory传递的类别是历史):-

那么结果将是:-

i、 e.从功能上看,代码似乎没有问题

您可以添加如下内容:-

Log.d("CURSORINFO",String.valueOf(cursor.getCount())+ " rows were extracted.");
然后运行并检查日志,查看提取了多少行

  • 如果数字大于0,则您的问题在别处(稍后)
  • 如果数字为0,请尝试删除where子句(例如,下面的代码)并重新运行。如果仍然检索0行,则很可能没有关联数据。i、 e.对于要包含的答案,它必须引用一个问题

        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);
    

尽管这个问题很长,但它几乎没有提供任何答案。您需要将其简化为一个,注意这可能并不意味着从实际程序中选择逐字摘录(有关更多信息,请参见链接)。如果问题是您突出显示的查询没有返回结果,那么我们将希望看到实际的查询文本和相关表的一些示例数据,其他可能不多。查询文本已经在问题中,以我的Java代码中的rawQuery的形式存在。我非常乐意提供关于表格的更多信息。让我抓取一些表数据并将其发布。查询文本不在问题中。好的,如果你不是指查询本身,那么我显然误解了你,在网上搜索后,我仍然不确定你要查找的文本。至于最小的代码,我的问题中只有两个SQL查询,我无法使代码完整且可运行,因为它需要数据库以及应用程序中的Java代码。在这一阶段,我只想让某人看看SQL查询,并告诉我它们是否有效,因此我添加了一个表的屏幕截图来提供帮助。我指的是查询本身。作为文本。感谢一百万个MikeT,这真的很有帮助,现在我有很多事情要做使用公认的答案收集信息,以及“DatabaseUtils.dumpCursorToString(cursor);”为了查看光标所包含的数据,我对问题进行了排序。应用程序中的“selected category”以大写字母开头,但DB category都是小写,因此查询结果中的所有内容都被过滤掉了。
    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);