![](/img/trans.png)
[英]The best way to store large set of objects with efficient update/append operations
[英]Best way to store, change, and save large number of class objects
我正在用Android开发我的第一个应用程序,并试图处理如何保存用户在交互式小说游戏中对某些对象变量所做的更改。
在游戏中,共有三个主要类别:房间,物品和玩家。 每个类都包含许多属性(即布尔值,字符串和列表),并且这些属性在游戏过程中会随着玩家与它们的交互而改变,例如,门是否打开或关闭,或者是否使用了不发光的灯笼。一根火柴,它变成了一个灯笼,属性改变了。 到目前为止,我已经将所有对象放置在主活动类中,并通过在各种方法中编写类似“ shedDoor.isopen = false”的代码来更改属性。 到现在为止一切正常。
我是个初学者,所以我忽略了处理任何类型的保存功能,并认为实现起来很简单,但是现在我几乎完成了游戏,因此我意识到它的处理难度比我想象的要难得多。
因此,我的问题是:“最好的存储我的游戏数据的方法是什么,以便即使在应用程序被终止后,更改仍然存在?” 我计划为用户提供一个加载和保存按钮,以使他们回到游戏中的位置,如果他们想从头开始,还需要一个新的游戏按钮。 我已经看过sharedPreferences,但是我不确定这是否适用于不同数据类型的多个类。
我的直觉使我相信,创建SQLite数据库是一个可行的方法,但是我必须对我的许多代码进行全面的修改以实现这一点,并希望在开始这项大事业之前获得更多专家建议。
与往常一样,感谢您对初学者的帮助。
我对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之类的引擎,因为它简化了很多事情,只需查看一下其主页即可
对于复杂数据,应使用具有自己格式的平面文件或SQLite数据库。 无论哪种方式,您都应明智地将在任何给定时间所需的数据加载到内存中,而不要一次加载所有内容。 即使移动设备的功能每年都在变得越来越强大,但它们在可用资源方面仍然非常有限。
您可以使用SharedPreferences来存储游戏状态数据。 要处理不同的数据类型,可以使用gson序列化游戏数据对象,然后将其另存为字符串到SharedPreferences中。 您只需要使游戏状态数据对象实现可序列化即可。
在google-gson上了解有关gson的更多信息。
在这里使用gson的步骤(取自https://stackoverflow.com/a/38089938/4758255 )可以在Gradle文件中添加GSON依赖项,方法如下:
compile 'com.google.code.gson:gson:2.7'
以下是代码段:
首先,创建您通常的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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.