【发布时间】:2017-06-20 16:45:58
【问题描述】:
我正在为多数据库设置创建索引。每次创建新数据库时,我都需要一个索引,以便该人可以连接到他们想要处理的数据库。将索引保存在 json 文件中后,一旦我再次加载它,如何在不删除现有数据的情况下添加它?我看过的大多数教程都告诉你如何保存和加载,但没有告诉你可以对现有数据做什么。谢谢!虽然我使用 JSONUtility 因为这是一个非常简单的操作,但我并不反对对其他库的任何建议。
【问题讨论】:
我正在为多数据库设置创建索引。每次创建新数据库时,我都需要一个索引,以便该人可以连接到他们想要处理的数据库。将索引保存在 json 文件中后,一旦我再次加载它,如何在不删除现有数据的情况下添加它?我看过的大多数教程都告诉你如何保存和加载,但没有告诉你可以对现有数据做什么。谢谢!虽然我使用 JSONUtility 因为这是一个非常简单的操作,但我并不反对对其他库的任何建议。
【问题讨论】:
您可以通过将 Json 保存为 List 来真正简化此操作。当您想修改现有的时,只需加载它并使用Add 函数继续添加到列表中。仅在真正需要时才保存。
Unity 的JSONUtility 无法序列化/反序列化数组或列表,因此我们需要使用构建在JSONUtility 之上的JsonHelper 包装器。你可以得到那个here。
测试数据加载序列化和反序列化:
[Serializable]
public class PlayerData
{
public string name;
public int score;
}
创建它和它的列表:
List<PlayerData> saveListData = new List<PlayerData>();
PlayerData saveData = new PlayerData();
saveData.name = "Programmer";
saveData.score = 80;
saveListData.Add(saveData);
保存(必须转换成数组才能保存):
string jsonToSave = JsonHelper.ToJson(saveListData.ToArray());
PlayerPrefs.SetString("Data", jsonToSave);
PlayerPrefs.Save();
加载(必须加载为数组然后转换回列表):
string jsonToLoad = PlayerPrefs.GetString("Data");
//Load as Array
PlayerData[] _tempLoadListData = JsonHelper.FromJson<PlayerData>(jsonToLoad);
//Convert to List
List<PlayerData> loadListData = _tempLoadListData.OfType<PlayerData>().ToList();
for (int i = 0; i < loadListData.Count; i++)
{
Debug.Log("Got: " + loadListData[i].name);
}
向加载的数据添加更多内容?
loadListData.Add(new PlayerData());
loadListData.Add(new PlayerData());
loadListData.Add(new PlayerData());
loadListData.Add(new PlayerData());
然后您可以再次保存它。
【讨论】:
using System.Linq; 需要使用 OfType。您也可以使用循环手动执行此操作。
如果存在,则读入现有的 JSON,将其保存在字符串中。然后当你准备好保存时,你只需要将旧的 JSON 连接到新生成的 JSON 并保存到磁盘。
提示:如果您还没有使用 Json.NET。
【讨论】: