2017-02-21 11 views
0

Я создал приложение, которое имеет функции сохранения/загрузки (личные данные и т. Д.). Когда приложение работает, данные сохранения и загрузки работают хорошо. К сожалению, после повторного открытия приложения сохраненные данные исчезают, и когда я пытаюсь открыть файлы, у меня есть исключение с нулевой ссылкой. В настройках (tools-> option-> xamarin) я проверил «Сохранить данные приложения/кеш на устройстве между развертываниями». Ниже приведены мои функции ввода/вывода:Xamarin Android потерял данные после повторного открытия приложения

public void SerializeObject(T obj) 
    {    
     string jsonData = JsonConvert.SerializeObject(obj); 
     JsonSerializer serializer = new JsonSerializer(); 
     serializer.NullValueHandling = NullValueHandling.Ignore; 
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
     var filePath = Path.Combine(documentsPath, "data.txt"); 
     System.IO.File.WriteAllText(filePath, jsonData); 
    } 
    public T DeSerializeObject() 
    { 
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
     var filePath = Path.Combine(documentsPath, "data.txt"); 
     string text = System.IO.File.ReadAllText(filePath); 
     T obj = JsonConvert.DeserializeObject<T>(text); 
     return obj; 
    } 

редактирования: Ниже функции Button.click которые экономят данные.

private void saveButtonClick(object sender, EventArgs e) 
    {    
     _data.x = this.x; 
     _data.y = this.y; 
     _data.z = this.z; 
     IOoperation<Data> save = new IOoperation<Data>(); 
     save.SerializeObject(_data); 
     TextView _current = FindViewById<TextView>(Resource.Id.currentPositionTextView); 
     _current.Text = string.Format("Saved position: {0}, {1}, {2}", _data.x, _data.y, _data.z); 
    } 

    private void loadButtonClick(object sender, EventArgs e) 
    { 
     IOoperation<Data> load = new IOoperation<Data>();    
     Data obj = load.DeSerializeObject(); 

     TextView _current = FindViewById<TextView>(Resource.Id.currentPositionTextView); 
     _current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", _data.x, _data.y, _data.z); 
    } 
+0

Использование System.IO .File.WriteAllText создаст новый файл с доступной только новой записью n вы пытаетесь десериализовать объект. По этому сценарию будет только одна запись. Вы потенциально перезаписываете то, что ожидаете от вас, или ожидаете, что десериализовать, чтобы вернуть несколько записей? https://msdn.microsoft.com/en-us/library/system.io.file.writealltext(v=vs.110).aspx –

+0

Я не могу воспроизвести вашу проблему, я создал [demo] (https: //github.com/mikexxma/SpecialFolder.Personal_Demo.git) с вашим кодом, он отлично работает, когда я снова открываю приложение. –

+0

Я хочу просто переписать мой файл с новыми данными. @MikeMa Я редактировал свой пост и есть дополнительный код. Может быть, что-то не так. – krawat10

ответ

0

Я нашел этот вопрос:

_current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", _data.x, _data.y, _data.z);

При открытии приложения _data является null, пожалуйста, используйте obj, чтобы получить данные:

_current.Text = string.Format("Saved position: {0}, {1}, {2} - loaded", obj.x, obj.y, obj.z);

+0

Все работает! Благодаря! – krawat10

Смежные вопросы