I’ve recently been having issues with saving json data. On Unity Editor it works perfectly but once built for android it throw me a null exception from SetData and GetData which is false error to me since this not happening on pc at all.
Even if i try to see what is going on there there’s absolutely no errors in there or at least i think.
It’s literally weird because this work for me for 3 months straight and i don’t changed anything in there since this is the only data i’m saving right now.
I double checek all reference in SetData and GetData they’re basically scriptableObjects which they’re all assigned properly
This is the code that i’m using to SetData:
private void SetData()
{
dataStats.playerGoods.gold = configurationBasePlayer.gold;
dataStats.playerGoods.diamond = configurationBasePlayer.diamond;
dataStats.playerGoods.metal = configurationBasePlayer.metal;
dataStats.playerGoods.brilliant = configurationBasePlayer.brilliant;
for (int i = 0; i < heroConf.Length; i++)
{
if (heroConf.Length > dataStats.startHeroStats.Count)
{
dataStats.startHeroStats.Add(new StartHeroStats());
}
if (heroConf.Length == dataStats.startHeroStats.Count)
{
dataStats.startHeroStats[i].isUnlocked = heroConf[i].isUnlockedHero;
dataStats.startHeroStats[i].isSelected = heroConf[i].isSelected;
dataStats.startHeroStats[i].damage = heroConf[i].damage;
dataStats.startHeroStats[i].rangeAttack = heroConf[i].rangeAttack;
dataStats.startHeroStats[i].startHp = heroConf[i].startHealth;
dataStats.startHeroStats[i].ownSpeedHero = heroConf[i].OwnSpeedNavMesh;
dataStats.startHeroStats[i].currentXp = heroConf[i].currentXp;
dataStats.startHeroStats[i].levelHero = heroConf[i].level;
}
}
for (int i = 0; i < turretsConf.Length; i++)
{
if (turretsConf.Length > dataStats.turrets.Count)
{
dataStats.turrets.Add(new Turrets());
}
if (turretsConf.Length == dataStats.turrets.Count)
{
dataStats.turrets[i].isTurretPayed = turretsConf[i].isPayed;
dataStats.turrets[i].isTurretSelected = turretsConf[i].isSelected;
dataStats.turrets[i].isTurretUnlocked = turretsConf[i].isUnlocked;
}
}
for (int i = 0; i < configurationAbility.Length; i++)
{
if (configurationAbility.Length > dataStats.upgrader.Count)
{
dataStats.upgrader.Add(new Upgrades());
}
if (configurationAbility.Length == dataStats.upgrader.Count)
{
dataStats.upgrader[i].unlockedUpgrade = configurationAbility[i].itemsUpgrade[i].currentUpgradeLevel;
dataStats.upgrader[i].isUnlocked = configurationAbility[i].itemsUpgrade[i].isUnlocked;
}
}
for (int i = 0; i < levelsData.Length; i++)
{
if (levelsData.Length > dataStats.levelItemArray.Count)
{
dataStats.levelItemArray.Add(new LevelItem());
}
if (levelsData.Length == dataStats.levelItemArray.Count)
{
dataStats.levelItemArray[0].unlocked = true;
dataStats.lastUnlockedLevel = CurrentLevel;
dataStats.levelItemArray = Items;
}
}
dataStats.timeData.lastRewardClaimed = DailyRewards.lastReward;
dataStats.timeData.availableRewardNow = DailyRewards.availableReward;
dataStats.timeData.FirstTime = DailyRewards.checkFirstTime;
dataStats.timeData.LastRewardTime = RewardBox.rewardsTimeInString;
dataStats.timeData.currentRewardnum = RewardBox.currentRewardIndex;
}
This is to GetData:
private void GetData()
{
configurationBasePlayer.gold = dataStats.playerGoods.gold;
configurationBasePlayer.diamond = dataStats.playerGoods.diamond;
configurationBasePlayer.metal = dataStats.playerGoods.metal;
configurationBasePlayer.brilliant = dataStats.playerGoods.brilliant;
for (int i = 0; i < heroConf.Length; i++)
{
if (heroConf.Length > dataStats.startHeroStats.Count)
{
dataStats.startHeroStats.Add(new StartHeroStats());
}
if (heroConf.Length == dataStats.startHeroStats.Count)
{
heroConf[i].isUnlockedHero = dataStats.startHeroStats[i].isUnlocked;
heroConf[i].isSelected = dataStats.startHeroStats[i].isSelected;
heroConf[i].damage = dataStats.startHeroStats[i].damage;
heroConf[i].rangeAttack = dataStats.startHeroStats[i].rangeAttack;
heroConf[i].startHealth = dataStats.startHeroStats[i].startHp;
heroConf[i].OwnSpeedNavMesh = dataStats.startHeroStats[i].ownSpeedHero;
heroConf[i].currentXp = dataStats.startHeroStats[i].currentXp;
heroConf[i].level = dataStats.startHeroStats[i].levelHero;
}
}
for (int i = 0; i < turretsConf.Length; i++)
{
if (turretsConf.Length > dataStats.turrets.Count)
{
dataStats.turrets.Add(new Turrets());
}
if (turretsConf.Length == dataStats.turrets.Count)
{
turretsConf[i].isPayed = dataStats.turrets[i].isTurretPayed;
turretsConf[i].isSelected = dataStats.turrets[i].isTurretSelected;
turretsConf[i].isUnlocked = dataStats.turrets[i].isTurretUnlocked;
}
}
for (int i = 0; i < levelsData.Length; i++)
{
if (levelsData.Length > dataStats.levelItemArray.Count)
{
dataStats.levelItemArray.Add(new LevelItem());
}
if (levelsData.Length == dataStats.levelItemArray.Count)
{
dataStats.levelItemArray[0].unlocked = true;
CurrentLevel = dataStats.lastUnlockedLevel;
Items = dataStats.levelItemArray;
}
}
for (int i = 0; i < configurationAbility.Length; i++)
{
if (configurationAbility.Length > dataStats.upgrader.Count)
{
dataStats.upgrader.Add(new Upgrades());
}
if (configurationAbility.Length == dataStats.upgrader.Count)
{
configurationAbility[i].itemsUpgrade[i].currentUpgradeLevel = dataStats.upgrader[i].unlockedUpgrade;
configurationAbility[i].itemsUpgrade[i].isUnlocked = dataStats.upgrader[i].isUnlocked;
}
}
DailyRewards.lastReward = dataStats.timeData.lastRewardClaimed;
DailyRewards.availableReward = dataStats.timeData.availableRewardNow;
DailyRewards.checkFirstTime = dataStats.timeData.FirstTime;
RewardBox.rewardsTimeInString = dataStats.timeData.LastRewardTime;
RewardBox.currentRewardIndex = dataStats.timeData.currentRewardnum;
}
This is how i save data to json:
public void SaveJsonLocal()
{
DirPath = Path.Combine(Application.persistentDataPath, FileNameJson);
if (!Directory.Exists(DirPath))
{
Directory.CreateDirectory(Path.GetDirectoryName(DirPath));
}
SetData();
if (useNewtonsoftJson)
{
mSavedGameFileContent = JsonConvert.SerializeObject(dataStats);
}
else
mSavedGameFileContent = JsonUtility.ToJson(dataStats);
if (useEncryption)
{
mSavedGameFileContent = protectorJsonFiles.Encrypts(mSavedGameFileContent);
}
using FileStream streamFile = new FileStream(DirPath, FileMode.Create, FileAccess.Write);
using StreamWriter sr = new StreamWriter(streamFile);
sr.Write(mSavedGameFileContent);
sr.Flush();
sr.Close();
streamFile.Close();
}
This is how i load data:
public void LoadJsonLocal()
{
if (File.Exists(DirPath))
{
using FileStream fileStream = new FileStream(DirPath, FileMode.Open, FileAccess.Read);
using StreamReader sr = new StreamReader(fileStream);
mSavedGameFileContent = sr.ReadToEnd();
sr.Close();
fileStream.Close();
Debug.Log("Json exist and readed successfully");
if (useEncryption)
{
mSavedGameFileContent = protectorJsonFiles.Decrypts(mSavedGameFileContent);
}
if (useNewtonsoftJson)
{
dataStats = JsonConvert.DeserializeObject<GameDataStorage>(mSavedGameFileContent);
}
else
{
dataStats = JsonUtility.FromJson<GameDataStorage>(mSavedGameFileContent);
}
GetData();
}
else
{
SaveJsonLocal();
}
}