2013-11-19 4 views
0

У меня есть одна проблема, которую я не могу решить (по крайней мере, я еще не нашел решение ...) Я хотел добавить данные в IsolatedStorageSettings в WP8. Моя цель - проверить, есть ли какие-то настройки уже там, но когда я хочу проверить, я получаю исключение, которое я не могу решить.IsolatedStorageSettings WP8

private IsolatedStorageSettings appSettings = new IsolatedStorageSettings(); 

       private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     //correct this part 
     if (String.IsNullOrEmpty((string)appSettings["ICE1"])|| 
      String.IsNullOrEmpty((string)appSettings["ICE2"]) || 
      String.IsNullOrEmpty((string)appSettings["ICE3"]) || 
      String.IsNullOrEmpty((string)appSettings["address"]) || 
      String.IsNullOrEmpty((string)appSettings["fullName"])) 
     { 
     appSettings.Add("fullName", fullName.Text); 
     appSettings.Save(); 

     appSettings.Add("address", address.Text); 
     appSettings.Save(); 
     if (Regex.IsMatch(prefix1.Text, "^+\\d{2,3}") && Regex.IsMatch(number1.Text, "d{6,10}")) 
     { 
      appSettings.Add("ICE1", prefix1.Text + number1.Text); 
      appSettings.Save(); 
     } 
     else 
     { 
      MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
     } 
     if (Regex.IsMatch(prefix2.Text, "^+\\d{2,3}") && Regex.IsMatch(number2.Text, "d{6,10}")) 
     { 
      appSettings.Add("ICE2", prefix2.Text + number2.Text); 
      appSettings.Save(); 
     } 
     else 
     { 
      MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
     } 
     if (Regex.IsMatch(prefix2.Text, "^+\\d{2,3}") && Regex.IsMatch(number2.Text, "d{6,10}")) 
     { 
      appSettings.Add("ICE3", prefix2.Text + number2.Text); 
      appSettings.Save(); 
     } 
     else 
     { 
      MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
     } 
     MessageBox.Show("Your information is saved...!"); 
     } 
     else 
     { 
     // 
      appSettings["fullName"] = fullName.Text; 
      appSettings.Save(); 

      appSettings["address"] = address.Text; 
      appSettings.Save(); 
      if (Regex.IsMatch(prefix1.Text, "^+\\d{2,3}") && Regex.IsMatch(number1.Text, "d{6,10}")) 
      { 
       appSettings["ICE1"]= prefix1.Text + number1.Text; 
       appSettings.Save(); 
      } 
      else 
      { 
       MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
      } 
      if (Regex.IsMatch(prefix2.Text, "^+\\d{2,3}") && Regex.IsMatch(number2.Text, "d{6,10}")) 
      { 
       appSettings["ICE2"] = prefix2.Text + number2.Text; 
       appSettings.Save(); 
      } 
      else 
      { 
       MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
      } 
      if (Regex.IsMatch(prefix2.Text, "^+\\d{2,3}") && Regex.IsMatch(number2.Text, "d{6,10}")) 
      { 
       appSettings["ICE3"] = prefix3.Text + number3.Text; 
       appSettings.Save(); 
      } 
      else 
      { 
       MessageBox.Show("Invalid prefix number, please use +01 and for numbers only 0-9..."); 
      } 

      MessageBox.Show("Your information is saved...!"); 
     } 

Может кто-нибудь объяснить, как IsolStorageWorks? Как я могу исправить эту часть, потому что это вызывает проблему:

if (String.IsNullOrEmpty((string)appSettings["ICE1"])|| 
      String.IsNullOrEmpty((string)appSettings["ICE2"]) || 
      String.IsNullOrEmpty((string)appSettings["ICE3"]) || 
      String.IsNullOrEmpty((string)appSettings["address"]) || 
      String.IsNullOrEmpty((string)appSettings["fullName"])) 

мне нужно сделать appSettings.Save() каждый каждый раз, когда я хочу добавить данные или обновления-It Do ...?

У меня есть еще одна проблема получения данных из IsolatedStorageSettings:

 public WindowsPhoneControl2() 
    { 
     InitializeComponent(); 
    } 
    string ice1; 
    string ice2; 
    string ice3; 

    PhoneCallTask ptask = new PhoneCallTask(); 

    private void Image_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     ptask.PhoneNumber = ice1; 
     ptask.DisplayName = "Contact person 1"; 
     ptask.Show(); 
    } 

    private void Image_Tap_1(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     ptask.PhoneNumber = ice2; 
     ptask.DisplayName = "Contact person 2"; 
     ptask.Show(); 
    } 

    private void Image_Tap_2(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     ptask.PhoneNumber = ice3; 
     ptask.DisplayName = "Contact person 3"; 
     ptask.Show(); 
    } 

    private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; 
     appSettings.Contains("fullName"); 

     fullName.Text = (string)appSettings["fullName"]; 
     address.Text = (string)appSettings["address"]; 
     phone1.Text = (string)appSettings["ICE1"]; 
     phone2.Text = (string)appSettings["ICE1"]; 
     phone3.Text = (string)appSettings["ICE1"]; 

     ice1 = phone1.Text; 
     ice2 = phone2.Text; 
     ice3 = phone3.Text; 
    } 

особенно эта часть, которая, как предполагается, чтобы получить данные из словаря:

  fullName.Text = (string)appSettings["fullName"]; 
     address.Text = (string)appSettings["address"]; 
     phone1.Text = (string)appSettings["ICE1"]; 
     phone2.Text = (string)appSettings["ICE1"]; 
     phone3.Text = (string)appSettings["ICE1"]; 
+0

Какое исключение вы получаете? – Ben

ответ

4

IsolatedStorage Settins работает как dictionary.
Я думаю, вы должны изменить:

private IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings; 

Я предпочел бы использовать метод Содержит, чтобы проверить, нет ли там ключ:

if (userSettings.Contains("ICE1")|| 
     userSettings.Contains("ICE2") || 
     userSettings.Contains("ICE3") || 
     userSettings.Contains("address") || 
     userSettings.Contains("fullName")) 

Согласно MSDN, настройки сохраняются при закрытии приложения или вы звоните Сохранить:

Data written to the IsolatedStorageSettings object is saved when the application that 
uses the class is closed. If you want your application to write to isolated storage 
immediately, you can call the Save method in application code. 

EDIT
Пример кода, чтобы играть с:

public partial class MainPage : PhoneApplicationPage 
{ 
    private IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings; 

    public MainPage() 
    { 
    InitializeComponent(); 

    bool isKey = userSettings.Contains("anyKey"); //toggle break point at this line 
    userSettings.Add("anyKey", "myValue"); 
    isKey = userSettings.Contains("anyKey"); 
    string value = (string)userSettings["anyKey"]; 
    } 
} 
+0

, но если это поле не инициировано, оно не существует. это означает, что пользовательские настройки будут иметь нулевое значение. Согласно MSDN http://msdn.microsoft.com/en-us/library/cc614991%28v=vs.95%29.aspx, это даст мне исключение из значения нулевого ключа. Что тогда? – dovla091

+0

было бы целесообразно использовать userSettings.Count> 0 перед тестированием определенного поля в словаре? – dovla091

+0

ApplicationSettings относится к вашему приложению: http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff402541(v=vs.105).aspx, и вы используете свойство ApplicationSettings http://msdn.microsoft. com/en-us/library/system.io.isolatedstorage.isolatedstoragesettings.applicationsettings (v = vs.95) .aspx, чтобы инициировать поле (моя первая строка кода выше частного ...). Содержит (что вы спросите) вернуть значение bool в зависимости от того, существует ли ключ или исключить исключение, если вы вводите неправильное имя ключа. Если вы знаете точное имя ключа, вы можете проверить, существует ли он в словаре. – Romasz

0

IsolatedStorageSetting хранит данные в пары ключ/значение. Если есть ключ, то должно быть значение относительно этого ключа. поэтому просто попробуйте проверить, существует ли ключ в настройке или нет, используя if(settings.Contains("YourKey")). Если условие истинно, выполните свою работу. Спасибо