【问题标题】:How should I create question_bank in Android trivia game?我应该如何在 Android 问答游戏中创建 question_bank?
【发布时间】:2013-07-14 01:12:06
【问题描述】:

我正在为 Android 平台创建一个简单的问答游戏。 (无论如何,我是一个业余爱好者,只有在我能够腾出空闲时间时才有时间编写代码。因此,我的问题——就像我的技能一样——非常基础。)

如果我对 QuestionActivity 页面上的所有问题进行硬编码,我的游戏就可以运行,但从长远来看,这显然不是一个好方法。

我创建了一个包含以下属性的 Question 对象:String question、String[] answers、int correctPointer、String PithyComment。每个 Question 对象只有 4 个可能的答案。在 QuestionActivity 页面上,我创建了一个包含多个 Question 对象的 questionArray。我可以打乱数组中的项目,我可以打乱可能的答案,然后再将它们显示给用户,并且所有错误检查都可以正常工作。

我还创建了一个包含 50 多个问题的 XML 文件。我想在游戏初始化时将此文件的内容加载到 QuestionBank 对象数组中。过去几天我一直在研究这个问题,但我无法找出前进的最佳方法。在 Android/Java 中解析 XML 似乎比过去在其他编程语言中更复杂。每个 XML 解析教程似乎最终都需要创建多个类来处理这个非常简单的数据结构。我想知道是否有一些我根本没有看到的超级明显,更“成熟”的东西。

我的问题是:我应该使用 SAX、STAX 还是通过 DOM 解析器来解析 XML 文件。或者,考虑到这个游戏永远不会有超过 500 个问题,我应该考虑改用 SQL Lite 吗?或者有更好的方法吗?

我不需要写入 XML,除了将一个标签的内容传递给适当的变量之外,我不需要做任何花哨的解析。可能与解析有关的唯一棘手的事情是每个问题有四个可能的答案。我有两个版本的 XML 文件:一个版本中的每个答案都与其他项目(问题、正确指针)处于同一级别,另一个版本中的四个答案包含在名为 answerList 的父标记中。在这一点上,由于总是四个答案并且它们总是以相同的顺序出现,我倾向于将所有四个答案编码在与 XML 中的其他项目相同的级别,然后手动推送当我将它们读入 QuestionBank 时,将它们放入一个数组中。

谢谢。

【问题讨论】:

    标签: java android xml dom sax


    【解决方案1】:

    将其存储为数据库当然是一种选择,并且可能是取决于您遇到的问题数量的方式。

    我建议使用 JSON。 JSON 解析内置于 Android 中,也是大多数数据在 REST API 中传递的方式。

    这里有一个很好的教程:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

    您的问题结构如下所示:

    {
        "question": "Sample Question",
        "answers": [ "A", "B", "C", "D" ],
        "correctPointer" 2,
        "pithyComment": "Not sure what a pithy comment is."
    }
    

    另一个相当详细的例子:How to parse JSON in Android

    【讨论】:

    • 谢谢,ggmathur。我将从 DOM Parser 开始,还将尝试 JSON 解析,因为我确信我最终也必须处理数据库。 (顺便说一句,“精辟的评论”是指游戏在告诉用户他们的问题是对还是错时做出的评论。)谢谢!
    【解决方案2】:

    这是一个很好的tutorial on DOM Parser。它很简单,不太冗长,您不需要创建多个类来使用它。

    例如(来自教程):

    <?xml version="1.0"?>
    <company>
        <staff id="1001">
            <firstname>yong</firstname>
            <lastname>mook kim</lastname>
            <nickname>mkyong</nickname>
            <salary>100000</salary>
        </staff>
        <staff id="2001">
            <firstname>low</firstname>
            <lastname>yin fong</lastname>
            <nickname>fong fong</nickname>
            <salary>200000</salary>
        </staff>
    </company>
    

    如何使用解析器:

     try {
    
        File fXmlFile = new File("/Users/mkyong/staff.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
    
        //optional, but recommended
        //read this - http://*.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        doc.getDocumentElement().normalize();
    
        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
    
        NodeList nList = doc.getElementsByTagName("staff");
    
        System.out.println("----------------------------");
    
        for (int temp = 0; temp < nList.getLength(); temp++) {
    
            Node nNode = nList.item(temp);
    
            System.out.println("\nCurrent Element :" + nNode.getNodeName());
    
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
    
                Element eElement = (Element) nNode;
    
                System.out.println("Staff id : " + eElement.getAttribute("id"));
                System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
                System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
                System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
                System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
    
            }
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
      }
    

    【讨论】:

    • 谢谢,史蒂夫。这似乎正是我想要的。一旦我设法让一切正常工作,我将在 cmets 中进行更新。
    • 如果其他人正在寻求此解决方案,您应该知道 try 块的第一行不太可能工作。在我的系统上,即使路径看起来正确,它也只是拒绝读取文件。如果您遇到此问题,请将您的 xml 文件放在 res/raw 中(您需要创建一个 raw 子文件夹)。然后,将 try 块的第一行替换为: InputStream fXmlFile = getResources().openRawResource(R.raw.yourxmlfile)
    • @AaronDelwiche 你用的是什么操作系统?