Save object list in Preferences (.NET MAUI)

421 Views Asked by At
public class Audioguia
{
    public int id { get; set; }
    public string name{ get; set; }
    public string direction{ get; set; }
    public string image { get; set; }

}

Hello, my boss has tasked me with adding an option to save a list of 'audioguides' (object for context above) as 'my audioguides' in an audioguide app. The user should be able to access this list at their convenience. The challenge here is that he wants to avoid using a database and has inquired whether this can be accomplished locally. I thought that this might be achievable by utilizing 'preferences.' However, I am encountering difficulties, particularly in serializing the data. I'm not even sure if it's possible to save a list of objects in this manner. Does anyone have insights on how to accomplish this, or can you confirm whether it is indeed possible? This is what I've attempted so far, but it hasn't been successful:

public class AudioguiaService
{
    private const string KeyAudioguias = "Audioguias";

    public List<Audioguia> GetAudioguias()
    {
        if (Preferences.ContainsKey(KeyAudioguias))
        {
            string audioguiaJson = Preferences.Get(KeyAudioguias, string.Empty);
            if (!string.IsNullOrEmpty(audioguiaJson))
            {
                return JsonConvert.DeserializeObject<List<Audioguia>>(audioguiaJson);
            }
        }
        return new List<Audioguia>();
    }

    public void AddAudioguia(Audioguia audioguia)
    {
        List<Audioguia> audioguias = GetAudioguias();
        audioguias.Add(audioguia);

        string audioguiaJson = JsonConvert.SerializeObject(audioguias);
        Preferences.Set(KeyAudioguias, audioguiaJson);
    }
}
1

There are 1 best solutions below

0
H.A.H. On

You can write something like:

private const string KeyAudioguias = "Audioguias";
private const string KeyAudioguiasCount = "AudioguiasCount";

And add each Audiogia to separate entry in the settings:

public void AddAudioguia(Audioguia audioguia)
{
    int audiogiasCount = Preferences.Get(KeyAudioguiasCount, 0);

    string audioguiaJson = JsonConvert.SerializeObject(audioguia);
    Preferences.Set(KeyAudioguias + audiogiasCount, audioguiaJson);

    audiogiasCount++;
    Preferences.Set(KeyAudioguiasCount, audiogiasCount);                
}

And read each Audiogia separately, and add it to the list:

public List<Audioguia> GetAudioguias()
{
        List<Audioguia> result = new List<Audioguia>();
        int audiogiasCount = Preferences.Get(KeyAudioguiasCount, 0);

        for(int i = 0; i < audiogiasCount; i++)
        {            
            if (Preferences.ContainsKey(KeyAudioguias + i))
            {
                string audioguiaJson = Preferences.Get(KeyAudioguias + i, string.Empty);
                result.Add(JsonConvert.DeserializeObject<Audioguia>(audioguiaJson));
            }
        }        
        return result;
}

And this way you will not get errors because of the length. (Or you can serialize them in batches)

Or you can ignore your boss and do what programmers do, and place them in database.