【问题标题】:Best way to store, change, and save large number of class objects存储、更改和保存大量类对象的最佳方式
【发布时间】:2018-07-27 23:20:33
【问题描述】:

我正在制作我的第一个 android 应用程序,并试图处理如何保存用户对交互式小说游戏中某些对象变量所做的更改。

在游戏中,有三个主要类别:房间、物品和玩家。每个类都包含许多属性(即布尔值、字符串和列表),并且这些属性可以在整个游戏过程中随着玩家与它们交互而改变,例如门是否打开/关闭,或者是否使用未点亮的灯笼一根火柴,它变成了一个点亮的灯笼,属性发生了变化。到目前为止,我已将所有对象放在主活动类中,并通过在各种方法中编写诸如“shedDoor.isopen = false”之类的代码来更改属性。到目前为止,这一切都很好。

由于我是初学者,我忽略了处理任何类型的保存功能,并认为它很容易实现,但现在我几乎完成了游戏,我意识到它比我想象的要困难得多。

所以,我的问题是,“存储我的游戏数据的最佳方式是什么,以便即使在应用程序被终止后更改仍然存在?”我计划为用户提供一个加载和保存按钮,让他们回到他们在游戏中的位置,如果他们想从头开始,还有一个新的游戏按钮。我查看了 sharedPreferences,但我不确定它是否适用于不同数据类型的多个类。

我的直觉让我相信制作 SQLite 数据库是一条可行的路,但我必须彻底检查我的大量编码才能实现它,并希望在开始如此大的事业之前获得更多专家的建议。

一如既往,感谢您帮助初学者。

【问题讨论】:

    标签: java android object


    【解决方案1】:

    对于复杂的数据,您应该使用具有自己格式的平面文件或 SQLite 数据库。无论哪种方式,您都应该明智地将任何给定时间所需的数据加载到内存中,而不是一次加载所有内容。尽管移动设备每年都变得越来越强大,但它们的可用资源仍然非常有限。

    【讨论】:

      【解决方案2】:

      我对android不太了解,但我应该与桌面java几乎相似,所以这里有一些保存数据的方法(在java中):

      通过将数据以字符串形式写入某个文件来保存它们:

      BufferedWriter writer = new BufferedWriter(new FileWrite(new File(path));
      
      writer.write("string you want to write");
      

      通过将数据序列化到某个文件来保存对象(更高效):

      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("save.dat"));
      os.writeObject(objectyouwanttostore)
      

      编辑 1:

      顺便说一句,如果你只是想为 android 开发一个应用程序,我建议使用像 libgdx 这样的引擎,因为它简化了很多,只需看看他们的主页

      【讨论】:

        【解决方案3】:

        您可以使用 SharedPreferences 来存储您的游戏状态数据。要处理不同的数据类型,您可以使用 gson 序列化您的游戏数据对象,然后将其作为字符串保存到您的 SharedPreferences。你只需要让你的游戏状态数据对象实现可序列化。

        google-gson 上阅读有关 gson 的更多信息。

        这里是使用gson的步骤(取自https://stackoverflow.com/a/38089938/4758255) 您可以在 Gradle 文件中添加 GSON 依赖项:

        compile 'com.google.code.gson:gson:2.7'
        

        这里是sn-p:

        首先,创建您常用的 sharedPreferences:

        //Creating a shared preference
        SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);
        

        从可序列化对象保存到首选项:

         Editor prefsEditor = mPrefs.edit();
         Gson gson = new Gson();
         String json = gson.toJson(YourSerializableObject);
         prefsEditor.putString("SerializableObject", json);
         prefsEditor.commit();
        

        从首选项中获取可序列化对象:

        Gson gson = new Gson();
        String json = mPrefs.getString("SerializableObject", "");
        yourSerializableObject = gson.fromJson(json, YourSerializableObject.class);
        

        【讨论】:

        • SharedPreferences 适用于可以表示为键/值对的简单数据。
        • 不,你有点误会了。 The SharedPreferences class provides a general framework that allows you to save and retrieve persistent key-value pairs of primitive data types. You can use SharedPreferences to save any primitive data: booleans, floats, ints, longs, and strings. This data will persist across user sessions (even if your application is killed).
        • “原始数据”就是我所说的“简单数据”。使用 SharedPreferences 存储复杂的数据类型(如列表和对象)几乎是不可能的。
        • "primitive data" is what I mean by "simple data". 这仍然不太正确。 SharedPreferences 假设 String 是不正确的原始数据。使用 SharedPreference 假设字符串是原始数据,那么复杂的 json 字符串也是原始数据。这不是真的。我同意你最后的说法。将复杂的数据类型存储到 SharedPreferences 中并不是一个好的决定,但也不是不可能。
        • 根据您给出的报价,字符串被视为“原始数据”。显然,作者并没有在技术意义上使用它。无论如何,我的主要观点仍然存在。 SharedPreferences 不适用于 OP 询问的复杂数据。 @ישואוהבאותך
        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 2017-05-13
        • 2023-04-08
        相关资源
        最近更新 更多