【问题标题】:Android, Storing and retrieving TextAndroid,存储和检索文本
【发布时间】:2016-03-10 23:05:56
【问题描述】:

我目前正在为我的大学开发一个 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() 获取一个字符串,然后我需要子字符串以获取最后的数字,并且只是为了检索它应该去哪个节点占用一些资源。

换句话说,我想的越多,我想出的想法就越复杂,所以我需要一些聪明的人告诉我该去哪里。 (我明明已经迷失在路上了)

__________________________________ 我的问题 ________________________

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

你会用什么来存储文本?一个 XML 文件?之后你会用树吗?您将如何做到这一点,以有效地将 xml 分类到树中?

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

感谢您的回答!

【问题讨论】:

  • 嗯。有趣的问题。让我问你:路径是绝对的吗?就像相同的选择总是导致相同的路径?或者故事和选择可以相互混合吗?就像我可以在故事 1 中深入 5 个级别,然后将选择 33 作为我的选择之一吗?如果没有,我认为 JSON 可以很好地构建这种结构。
  • 嗯,我想保持路径绝对而不是混合,但我不得不承认你提出了一个有趣的观点,它可以让我节省很多资源来引导树的另一个分支。但是我必须返回一个告诉我去哪里的值,因为它将在树的完全不同的部分上。我不知道JSON,我会试试看,谢谢你的回答!

标签: java android xml database tree


【解决方案1】:

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

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

【讨论】:

    【解决方案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 时,只需从 Array 中调用该索引即可。您的工作流程可能看起来像这样......

    //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...
    

    对于“死亡”场景,我可能只会有一个索引为 -1 或类似的故事对象。因此,您可以随时测试 leads_to_story &lt; 0 是否并知道玩家是否死亡。

    希望这能让您对如何保持事情的可管理性和组织性有所了解。在这些类型的场景中,我总是很想尝试找到处理数据的“聪明”方法,但通常情况下,一种简单实用的方法效果更好,并使事情更具可读性和可管理性。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2016-08-22
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2018-06-23
      • 1970-01-01
      • 2018-02-27
      相关资源
      最近更新 更多