WokerHead
WokerHead

Reputation: 967

Problem in overwriting Application.persistentDataPath

I have a JSON file which contains data for my Localization in my game. The file is stored in Application.persistentDataPath . I read in the documentation that the file is not deleted or overwritten when updating the game. Currently I launch the app and the file is there but when I add more content and send an update to save again, it only has the original content.

But is there a way to update this file when I update the game? What if in the future I want to add more content to this JSON file, I would have to delete it and upload it again? Any way to update and overwrite it?

private static void Request(string file)
    {
        var loadingRequest = UnityWebRequest.Get(Path.Combine(Application.streamingAssetsPath, file));
        loadingRequest.SendWebRequest();
        while (!loadingRequest.isDone)
        {
            if (loadingRequest.isNetworkError || loadingRequest.isHttpError)
            {
                break;
            }
        }
        if (loadingRequest.isNetworkError || loadingRequest.isHttpError)
        {
            // Some error happened.
        }
        else
        {
            File.WriteAllBytes(Path.Combine(Application.persistentDataPath, file), loadingRequest.downloadHandler.data);
        }
    }

    // Loads key from "StreamingAssets/language_data.json" file.
    public static string LoadJson(string key)
    {
        Request("data.json");
        var jsonPath = Path.Combine(Application.persistentDataPath, jsonFileName);
        using (StreamReader r = new StreamReader(jsonPath))
        {
            var N = JSON.Parse(r.ReadToEnd());
            string result = N[GetLanguage()][key];
            return result;
        }
    }

Upvotes: 0

Views: 437

Answers (1)

derHugo
derHugo

Reputation: 90852

I think the issue is the following:

You are only creating a file named data.json NOT languages_data.json!

In Request (you pass in "data.json") you copy

Application.streamingAssetsPath, file

to

 Application.persistentDataPath, file

where file = "data.json"

Then in LoadJson you are trying to load values from

Application.persistentDataPath, jsonFileName

where - as to your comments - jsonFileName = "languages_data.json"

=> It is a different path!

In the Editor/on your PC you probably still have an old languages_data.json in the persistent data from some time ago. Therefore there is no error but it is also never updated. Delete the persistent/languages_data.json on your PC and it will throw a FileNotFoundException.


To solve this make 100% sure the file names are the same everywhere. The simplest fix code wise would be to simply rather use

Request(jsonFileName);

and make sure that jsonFileName matches the name of your existing file in StreamingAssets.

Upvotes: 2

Related Questions