Android,存储和检索文本

时间:2016-03-10 23:05:57

标签: java android xml database tree

我目前正在为我的大学开设一个Android应用程序,让我给你一个快速的演示文稿:

有一个故事,玩家可以阅读,然后他将有3个选择,他将选择一个,另一个故事将再次显示3个选择,所以它继续...(但每个选择导致一个完全不同的故事)

你可以猜到,我有很多文本需要存储,分类和检索。第一页显示第一个故事和3个选项,如果玩家选择并点击按钮,则会出现以下故事,但它也可能意味着结束(显然,如果我总是保留3条路径X 3路径X 3路径...它会变得复杂)

_______________我在想什么____________________________

所以我的第一个猜测是使用一个xml文件,一个包含每个故事,另一个包含各种选择。

在应用程序打开时,我会使用解析器来运行文件并将每个字符串放在树结构中。 (故事中有一棵树,我想的是另一棵树)

我想使用数字来构建它,例如,如果你当前在1并且你点击选择2然后你在前一个故事的末尾再添加2,它将变为12,然后如果你点击在选择3,它变成123等... 我虽然对树更容易,但是,xml只给出一个标签名称所以我想使用story1,story11,story12,story13等......

What the structure of my xml should look like (or my tree)

但是因为我想使用数字,所以已经很难在树中对它进行分类,我必须得到一个带有parser.parName()的String,然后我需要substring来获取最后的数字,只是要在哪个节点中检索它需要一些资源。

在其他方面,我越是想到它,我就越想提出复杂的想法,所以我需要一些聪明的人来告诉我去哪里。 (我在路上显然迷失了自己)

__________________________________我的问题____________________________

如果你觉得这个很聪明,这是我的问题

你会用什么来存储文字?一个Xml文件?那之后你会用一棵树吗?你会怎么做,有效地将xml分类到树中?

我可以看到我的解释有点混乱,所以请告诉我他们是不是你不明白的东西。 (或者如果是我的英语破碎)

感谢您的回答!

2 个答案:

答案 0 :(得分:6)

就个人而言,我会将每个场景分别放在一个JSON文件中,如果不需要翻译任何资产,每个选项都有一个指向下一个文件名的键。您可以在运行时加载第一个文件(或上次保存)。方案的文件名将是“保存”本身。

但是,如果您需要翻译任何故事线,您可能希望将其转储到“strings.xml”中,然后在运行时创建树,并引用相应的R.string ID。但是,在这种情况下,R.string id不应该用作保存,因为它可以在编译之间进行更改。每个故事场景应该有一个永远不应该修改的场景ID(枚举会这样做)

答案 1 :(得分:2)

在仔细思考这个问题之后,我基本上对Kenny Byun的回答提出了类似的想法,但我想用一些实际的代码来充实它,告诉你它是如何工作的。

首先,我会将每个故事存储在自己的JSON对象中。我不知道他们需要像Kenny建议的那样在单独的文件中,因为它们可以很容易地包含在单个文件中的JSON数组中的单独对象中。结构如下。

数组中的每个对象都是一个"故事"宾语。这包含一个索引或某种id,以将其标识为一个独特的故事。然后它包含它的故事文本,以及一个3"选择"对象。选择对象是相似的,因为它们每个都包含一个id或索引,一些文本和一个" leads_to_story"价值,基本上确定了这个选择导致的故事。它看起来像这样......

[
    {
        "story_index" : 0,
        "story_text" : "It was a dark and stormy night. Three doors stand before you. You must choose one.",
        "choices" : [
            {
                "choice_index" : 0,
                "choice_text" : "Door 1",
                "leads_to_story" : 1 
            },
            {
                "choice_index" : 1,
                "choice_text" : "Door 2",
                "leads_to_story" : 2
            },
            {
                "choice_index" : 2,
                "choice_text" : "Door 3",
                "leads_to_story" : 3
            }
        ]
    },
    {
        "story_index" : 1,
        "story_text" : "You choose door 1 and enter cautiously. You find a bunny rabbit.",
        "choices" : [
            {
                "choice_index" : 0,
                "choice_text" : "Pet the bunny rabbit.",
                "leads_to_story" : 4 
            },
            {
                "choice_index" : 1,
                "choice_text" : "Kill the bunny rabbit.",
                "leads_to_story" : 5
            },
            {
                "choice_index" : 2,
                "choice_text" : "Ask the bunny rabbit its name.",
                "leads_to_story" : 6
            }
        ]
    }
]

现在您已经以有条理的方式存储了所有故事和选择数据,我将创建两个类来存储此数据,以便在运行时进行访问。所以我会创建一个Story类和一个Choice类。他们可能看起来像这样......

public class Story {
    public int index;
    public String text;
    public Choice[] choices;

    public Story(int index, String text, Choice[] choices) {
        this.index = index;
        this.text = text;
        this.choices = choices;
    }
}

public class Choice {
    public String text;
    public int leads_to_story;

    public Choice(String text, int leads_to_story) {
        this.text = text;
        this.leads_to_story = leads_to_story;
    }
}

这将允许您将所有故事数据加载到有组织的对象中,然后可以从按数字顺序放置的Story对象数组中访问这些对象。因此,当您需要某个故事时,您只需从数组中调用该索引即可。您的工作流程可能看起来像这样......

//if this is a new game...

//Load and parse the JSON into a local array,
//placing the stories in numerical order
ArrayList<Story> stories = getStories();

//Present story 0, since this is a new game...
TextView textView = (TextView) findViewById(R.id.story_text);
Story story = stories.get(0); 
String storyText = story.text;
textView.setText(storyText);

//The player makes his choice, so you now
//get the leads_to_story value to find out
//where to go next...
int playerChoice = 1; //whatever they choose
int nextStory = story.choices[playerChoice].leads_to_story;

//New screen loads or is initialized,
//and we load the new story...
Story story = stories.get(nextStory);
//...repeat the process...

对于&#34;死亡&#34;方案,我可能只有一个索引为-1的故事对象或类似的东西。那么你可以随时测试是否leads_to_story < 0并知道玩家是否死亡。

希望这能为您提供一些如何让事情易于管理和组织的想法。在这些类型的场景中,我总是试图找到&#34;聪明的&#34;处理数据的方式,但通常情况下,简单,实用的方法更好,并使事情更易读和易于管理。希望这有帮助!