【发布时间】:2016-09-06 00:41:10
【问题描述】:
我已经学习了一段时间的 Android 开发,并且正在创建一个简单的应用程序以开始使用。该应用程序是一个简单的测验,会显示一个问题和一个用于回答问题的文本框。
我正在使用的框架 (Libgdx) 不支持 Sqlite,因此我无法使用它来存储所有问题和答案。我想知道如何在不使用数据库的情况下存储大量问题和答案,以及使用数组是否有效。
【问题讨论】:
我已经学习了一段时间的 Android 开发,并且正在创建一个简单的应用程序以开始使用。该应用程序是一个简单的测验,会显示一个问题和一个用于回答问题的文本框。
我正在使用的框架 (Libgdx) 不支持 Sqlite,因此我无法使用它来存储所有问题和答案。我想知道如何在不使用数据库的情况下存储大量问题和答案,以及使用数组是否有效。
【问题讨论】:
您可以将这些“大量问题和答案”保存在一个 txt 文件中......然后从那里阅读它们。
或
你可以使用SharedPreferences
这是保存值的一行示例
SharedPrefences.Editor
editor.putString(editKey.getText().toString()); // putString is the method of Editor class, and in this example editkey is the field for EditText
即使在应用关闭后,该值也会被存储。
【讨论】:
Preferences 类一起使用。 Preferences 是使事物在 HTML5 应用程序中持久化的唯一方法。但它们最有可能用于设置(如音量、图形质量......)。对于这类事情,我会使用 txt,作为 XML、Json 或 CSV 格式。
在 libdx 中,您不使用 sqlite,您只需使用他们提供的 preferences。它们以SharedPreferences 的形式存储在android 上,以xml 的形式存储在桌面上。为了存储问题,我几乎不建议使用 xml 格式并在运行时解析它。甚至可以加密/解密它。
让您了解我们在说什么。您可能使用刚刚破解的编辑器创建 XML。将其解析为好看的 xml 格式。例如,这是我的一个(不是为了提问,但我想你知道如何使用这个想法)
<root>
<quest1 id="1">
<name>quest1_name</name>
<description>quest1_description</description>
<subq type="KILL" monster_type="death" count="1" reward="15" />
</quest1>
<quest2 id="2">
<name>quest2_name</name>
<description>quest2_description</description>
<subq type="KILL" monster_type="silverbat" count="25" reward="45" />
</quest2>
</root>
现在您创建一个QuestionManager,在启动您的应用程序时启动它。这确实将根Element 的所有子项解析为一个问题。所以你的问题有一个构造函数,它接受一个Element。这是管理器内部的加载:
public void loadQuests() {
XmlReader r = new XmlReader();
Element e = null;
try {
e = r.parse(Gdx.files.internal("quest/quest.xml"));
}
catch (IOException a) {
}
if (e != null) {
for (int i = 0; i < e.getChildCount(); i++) {
m_quests.add(new Quest(e.getChild(i))); //has reference to the core class
}
}
}
还有 Quest(在这种情况下,我知道这不是一个问题!)
public Quest(Element xml) {
setID(xml.getInt("id"));
setTitle(xml.getChildByName(Quest.NAME).getText()); // final static string
setDescription(xml.getChildByName(Quest.DESC).getText());
}
即使有一千个问题也不应该是什么大问题。如果它确实让您的游戏在启动时滞后,请将加载放在一个单独的线程中,并且在加载完成或同步问题列表/数组之前不要开始使用QuestionManager。也可以使用 libgdx 的集合来获得更好的性能和更少的垃圾收集。
如果您真的想在 Android 上使用 sqllite,请选择 Interfacing with platform specific code。但是你不能在桌面上使用它!所以你需要创建一个桌面和一个android实现。
【讨论】:
<Answer correct="1">The Answer </Answer><Answer correct="0">Wrong Answer</Answer>)。
免责声明:我不熟悉 Android 开发。
使用数据库的替代方法可能是将 Java 对象序列化和反序列化为文件。 JSON(示例库:https://code.google.com/p/google-gson/)或 XML(示例库:http://x-stream.github.io/)是非常适合这种方法的文件格式。
【讨论】: