Извлечение данных из изолированного хранилища Windows Phone 7 - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь восстановить все данные в моем изолированном хранилище alarm.txt. Формат данных, сохраненных внутри, выглядит следующим образом: не «нет», «дом», «яблоко», «хао», «как», «....» и так далее. А затем я помещу разделенные данные «не», «нет», «домой» (3 на 3 и т. Д.) В элементы библиотеки для привязки данных.

Для моего кода ниже мне удалось получить только первые 3 данных. Что я должен сделать, чтобы он продолжал цикл?

строка [] alarmDetailsSeparated;

        var isoFile = IsolatedStorageFile.GetUserStoreForApplication();

        IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
        try
        {
            StreamReader readFile = new StreamReader(new IsolatedStorageFileStream("AlarmFolder\\alarm.txt", FileMode.Open, myStore));

            String fileText = readFile.ReadLine();

            //alarmDetailsSeparated is the array that hold the retrieved alarm details from alarm.txt and is split by '^'
            alarmDetailsSeparated = fileText.Split(new char[] { '^' });
            ObservableCollection<Items> LibraryItems = new ObservableCollection<Items>();

                for (int i = 0; i < alarmDetailsSeparated.Length; )
                {
                    if (test > 0)
                    {
                        i = test;
                    }
                    //To add the alarmDetailsSeparated into the alarmListBox
                    dateSeparate = alarmDetailsSeparated[i];
                    timeSeparate = alarmDetailsSeparated[i + 1];
                    labelSeparate = alarmDetailsSeparated[i + 2];

                    date = dateSeparate;
                    time = timeSeparate;
                    label = labelSeparate;

                    test = test + 3;
                    break;
                }
                LibraryItems.Add(new Items(time, label));
                alarmListBox.ItemsSource = LibraryItems;
            }

        catch (Exception)
        {
        }

        if (alarmListBox.Items.Count == 0)
        {
            noAlarmTxtBlock.Visibility = Visibility.Visible;
        }
    }
}

Ответы [ 4 ]

1 голос
/ 13 июля 2011

Ваша проблема может быть решена очень легко, используя реальную силу .NET Framework.Таким образом, вы избавляетесь от уродливого представления ваших данных.

Прежде всего, создайте класс для хранения ваших данных тревоги:

/// <summary>
/// Class that holds the information of an alarm.
/// </summary>
class Alarm
{
    public string Label { get; set; }
    public DateTime Time { get; set; }
}

Теперь мы создаем класс, который обслуживаетв качестве поставщика хранилища для XML-файла:

/// <summary>
/// Class that works as a storage provider to the XML file in the isolated storage
/// </summary>
class Storage
{
    public const string StorageFileName = "Alarms.xml";

    /// <summary>
    /// Loads alarms from the storage
    /// </summary>
    /// <returns>List of alarms</returns>
    public ObservableCollection<Alarm> Load()
    {
        ObservableCollection<Alarm> alarms = new ObservableCollection<Alarm>();

        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

        if(!storage.FileExists(StorageFileName))
        {
            return alarms;
        }

        using(var stream = storage.OpenFile(StorageFileName, System.IO.FileMode.Open))
        {
            XElement root = XElement.Load(stream);

            foreach(var alarmElement in root.Elements("alarm"))
            {
                alarms.Add(
                    new Alarm
                    {
                        Label = alarmElement.Element("label").Value,
                        Time = DateTime.Parse(alarmElement.Element("time").Value)
                    }
                );
            }
        }

        return alarms;
    }

    /// <summary>
    /// Saves alarms to the storage file (XML)
    /// </summary>
    /// <param name="alarms">Alarms to save</param>
    public void Save(ObservableCollection<Alarm> alarms)
    {
        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();

        using(var stream = storage.OpenFile(StorageFileName, System.IO.FileMode.Create))
        {
            XElement root = new XElement("alarms");

            // Build 
            foreach (var alarm in alarms)
            {
                root.Add(
                    new XElement("alarm",
                        new XElement("label", alarm.Label),
                        new XElement("time", alarm.Time)
                    )
                );
            }

            root.Save(stream);
        }
    }
}

Теперь используйте этот объект хранилища для загрузки и сохранения аварийных сигналов на своей странице:

var storage = new Storage();
var myAlarms = storage.Load();
alarmListBox.ItemsSource = myAlarms;

Теперь вам нужно привязать свойстваобъекта Alarm для управления.После этого добавьте кнопку [Сохранить] где-нибудь в вашем пользовательском интерфейсе и вызовите метод Save () класса хранения:

storage.Save(myAlarms);

Вот и все!Простое и чистое решение!Если честно, я не смог протестировать весь код, но это должно сработать ...

0 голосов
/ 12 июля 2011

В вашем заявлении For произошла ошибка.

Измените

 for (int i = 0; i < alarmDetailsSeparated.Length;)

на

 for (int i = 0; i < alarmDetailsSeparated.Length; i++ )
0 голосов
/ 12 июля 2011

Попробуйте это:

var fileText = "date1^time1^label1^date2^time2^label2^date3^time3^label3^date4^time4^label4";

var alarmDetailsSeparated = fileText.Split(new [] { '^' });

var output = new ObservableCollection<Items>();

for (var i = 0; i < alarmDetailsSeparated.Length; i = i + 3)
{
    output.Add(new Items
                    {
                        Date = alarmDetailsSeparated[i],
                        Time = alarmDetailsSeparated[i + 1],
                        Label = alarmDetailsSeparated[i + 2],
                    });
}
0 голосов
/ 12 июля 2011

Вы читаете только первую строку. Попробуйте:

string fileText;
while ((fileText = readFile.ReadLine()) != null)
{
....
}

Полный образец:

        var isoFile = IsolatedStorageFile.GetUserStoreForApplication();

    IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
    try
    {
        StreamReader readFile = new StreamReader(new IsolatedStorageFileStream("AlarmFolder\\alarm.txt", FileMode.Open, myStore));

        ObservableCollection<Items> LibraryItems = new ObservableCollection<Items>();

        string fileText;
        while ((fileText = readFile.ReadLine()) != null)
        {
            //alarmDetailsSeparated is the array that hold the retrieved alarm details from alarm.txt and is split by '^'
            alarmDetailsSeparated = fileText.Split(new char[] { '^' });

            for (int i = 0; i < alarmDetailsSeparated.Length; )
            {
                if (test > 0)
                {
                    i = test;
                }
                //To add the alarmDetailsSeparated into the alarmListBox
                dateSeparate = alarmDetailsSeparated[i];
                timeSeparate = alarmDetailsSeparated[i + 1];
                labelSeparate = alarmDetailsSeparated[i + 2];

                date = dateSeparate;
                time = timeSeparate;
                label = labelSeparate;

                test = test + 3;
                break;
            }
            LibraryItems.Add(new Items(time, label));
        }           
        alarmListBox.ItemsSource = LibraryItems;
    }

    catch (Exception)
    {
    }

    if (alarmListBox.Items.Count == 0)
    {
        noAlarmTxtBlock.Visibility = Visibility.Visible;
    }
}

}

...