Xamarin Forms Data Persistence Preferences, SecureStorage Step by step Implementation and Top 10 Questions and Answers
 Last Update: April 01, 2025      15 mins read      Difficulty-Level: beginner

Xamarin.Forms Data Persistence: Preferences and SecureStorage

Xamarin.Forms is a powerful framework that enables developers to build cross-platform mobile applications for Android, iOS, and UWP using C#. Data persistence is a crucial aspect of application development, allowing user data to be saved, retrieved, and managed across different sessions. Xamarin.Forms offers two primary mechanisms for data persistence: Preferences and SecureStorage. Both mechanisms have their unique use cases and are essential for various scenarios.

Xamarin.Forms Preferences

Preferences are a simple way to store small amounts of data as key-value pairs (strings, ints, bools, floats, and dates). This system is ideal for storing settings, configurations, and other small pieces of information that need to be retained between application sessions.

Important Information about Preferences
  1. Key-Value Store: Preferences use a key-value approach to store data. Each piece of data is associated with a unique key, which helps in identifying and retrieving the data.

  2. Supported Data Types: The supported data types include string, int, bool, float, and date. Preferences can serialize and deserialize these types, ensuring type safety.

  3. Thread Safety: Preferences are thread-safe, making them suitable for use in both UI and background threads without causing data integrity issues.

  4. Default Values: When retrieving data, it's possible to specify a default value to be returned if the specified key does not exist. This prevents null reference exceptions and makes the code more robust.

  5. Platform-Specific Storage: Preferences are implemented using platform-specific APIs:

    • Android: SharedPreferences
    • iOS: NSUserDefaults
    • UWP: ApplicationDataContainer
  6. Use Cases: Preferences are best used for storing non-sensitive settings like user preferences, application themes, or flags indicating app initialization steps.

Example Usage

Here is an example of how to use Preferences in Xamarin.Forms:

// Set a value
Xamarin.Essentials.Preferences.Set("username", "JohnDoe");

// Get a value
string username = Xamarin.Essentials.Preferences.Get("username", "defaultUsername");

// Remove a value
Xamarin.Essentials.Preferences.Remove("username");

// Clear all preferences
Xamarin.Essentials.Preferences.Clear();

Xamarin.Forms SecureStorage

SecureStorage is a more secure mechanism for storing sensitive data. It is designed to store small pieces of data securely, ensuring that the data is not exposed if the device is compromised.

Important Information about SecureStorage
  1. Encrypted Data: SecureStorage encrypts the data before storing it on the device. This encryption adds an extra layer of security compared to the plain-text storage mechanism used in Preferences.

  2. Platform-Specific Encryption: SecureStorage uses platform-specific encryption mechanisms:

    • Android: AES-256 encryption
    • iOS: Keychain Storage
    • UWP: Data Protection API
  3. Small Data Limitation: SecureStorage is designed to store small amounts of data. Storing large amounts of data might lead to performance issues or storage limits.

  4. No Concurrent Access: SecureStorage does not support concurrent access. Developers should avoid accessing the same key from different threads or tasks simultaneously.

  5. Use Cases: SecureStorage is best used for storing sensitive information such as access tokens, API keys, or other credentials.

  6. Error Handling: Accessing or manipulating data in SecureStorage can throw exceptions if there are issues related to permissions or storage. Proper error handling should be implemented to manage these exceptions gracefully.

Example Usage

Here is an example of how to use SecureStorage in Xamarin.Forms:

// Set a value
await Xamarin.Essentials.SecureStorage.SetAsync("token", "secureToken123");

// Get a value
string token = await Xamarin.Essentials.SecureStorage.GetAsync("token");

// Remove a value
await Xamarin.Essentials.SecureStorage.RemoveAsync("token");

// Clear all secure storage
await Xamarin.Essentials.SecureStorage.RemoveAllAsync();

Conclusion

Both Preferences and SecureStorage are essential tools for data persistence in Xamarin.Forms applications. Preferences provide a straightforward and efficient way to store non-sensitive data, while SecureStorage ensures the safety of sensitive information through platform-specific encryption mechanisms. By choosing the appropriate storage method, developers can enhance the functionality and security of their applications, providing a better user experience across different platforms.

Xamarin.Forms Data Persistence: Preferences & SecureStorage

Examples, Setting Route, Running the Application, and Data Flow Step-by-Step for Beginners

When developing applications using Xamarin.Forms, data persistence is crucial for ensuring user data is retained even if the app is closed or the device is restarted. Xamarin.Forms provides several mechanisms for data persistence, including Preferences and SecureStorage. In this guide, we'll cover these two mechanisms using step-by-step examples.


1. Setting Up Your Environment

Before we dive into data persistence, ensure you have:

  • Visual Studio: Make sure it's updated with the latest Xamarin packages.
  • Xamarin.Forms: Ensure the NuGet package Xamarin.Forms is installed in your project.
  • Xamarin.Essentials: This package contains the Preferences and SecureStorage classes. Install it via NuGet:
    Install-Package Xamarin.Essentials
    

2. Creating a Basic Xamarin.Forms Project

  1. Launch Visual Studio and create a new project.
  2. Select a Xamarin.Forms App template.
  3. Configure your project:
    • Name: DataPersistenceApp
    • Framework: .NET Standard 2.0
    • Finish creating the project.

3. Introduction to Data Persistence

Preferences: A simple key-value store for small pieces of data. Ideal for settings, theme preferences, etc.

SecureStorage: Securely stores sensitive information, such as passwords, API keys, or authentication tokens.


4. Using Xamarin.Essentials Preferences

Step-by-Step Example

  1. Add a New Page: Add a new page SettingsPage.xaml to store user settings.

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="DataPersistenceApp.SettingsPage"
                 Title="Settings">
        <StackLayout Padding="20">
            <Entry x:Name="usernameEntry" Placeholder="Enter your username"/>
            <Entry x:Name="themeEntry" Placeholder="Enter theme color (e.g., blue)"/>
            <Button Text="Save Settings" Clicked="SaveSettings_Clicked" />
            <Button Text="Load Settings" Clicked="LoadSettings_Clicked" />
        </StackLayout>
    </ContentPage>
    
  2. Create Event Handlers: In SettingsPage.xaml.cs, add event handlers to save and load settings.

    using Xamarin.Essentials;
    
    namespace DataPersistenceApp
    {
        public partial class SettingsPage : ContentPage
        {
            public SettingsPage()
            {
                InitializeComponent();
            }
    
            void SaveSettings_Clicked(object sender, EventArgs e)
            {
                Preferences.Set("username", usernameEntry.Text);
                Preferences.Set("theme", themeEntry.Text);
                DisplayAlert("Success", "Settings saved!", "OK");
            }
    
            void LoadSettings_Clicked(object sender, EventArgs e)
            {
                usernameEntry.Text = Preferences.Get("username", "defaultUsername");
                themeEntry.Text = Preferences.Get("theme", "defaultTheme");
                DisplayAlert("Success", "Settings loaded!", "OK");
            }
        }
    }
    
  3. Set Route: To navigate to the SettingsPage, set a route and use Shell.

    <!-- AppShell.xaml -->
    <Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
           xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
           x:Class="DataPersistenceApp.AppShell">
        <ShellContent Title="Settings"
                      ContentTemplate="{DataTemplate local:SettingsPage}"
                      Route="settingspage" />
    </Shell>
    
  4. Initialize Shell: Set the MainPage to AppShell.

    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
    
            MainPage = new AppShell();
        }
    }
    
  5. Run the App: Launch your application and navigate to the Settings tab. You should be able to save and load settings.


5. Using Xamarin.Essentials SecureStorage

Step-by-Step Example

  1. Add a New Page: Add another page SecureStoragePage.xaml to store sensitive information.

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="DataPersistenceApp.SecureStoragePage"
                 Title="Secure Storage">
        <StackLayout Padding="20">
            <Entry x:Name="passwordEntry" Placeholder="Enter your password" IsPassword="True"/>
            <Button Text="Save Password" Clicked="SavePassword_Clicked" />
            <Button Text="Load Password" Clicked="LoadPassword_Clicked" />
        </StackLayout>
    </ContentPage>
    
  2. Create Event Handlers: In SecureStoragePage.xaml.cs, add event handlers to save and load secure data.

    using Xamarin.Essentials;
    
    namespace DataPersistenceApp
    {
        public partial class SecureStoragePage : ContentPage
        {
            public SecureStoragePage()
            {
                InitializeComponent();
            }
    
            async void SavePassword_Clicked(object sender, EventArgs e)
            {
                try
                {
                    await SecureStorage.SetAsync("password", passwordEntry.Text);
                    DisplayAlert("Success", "Password saved securely!", "OK");
                }
                catch (Exception ex)
                {
                    DisplayAlert("Error", ex.Message, "OK");
                }
            }
    
            async void LoadPassword_Clicked(object sender, EventArgs e)
            {
                try
                {
                    var password = await SecureStorage.GetAsync("password");
                    passwordEntry.Text = password ?? "No password found.";
                    DisplayAlert("Success", "Password loaded securely!", "OK");
                }
                catch (Exception ex)
                {
                    DisplayAlert("Error", ex.Message, "OK");
                }
            }
        }
    }
    
  3. Set Route: Update AppShell.xaml to add the route for SecureStoragePage.

    <!-- AppShell.xaml -->
    <Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
           xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
           xmlns:local="clr-namespace:DataPersistenceApp"
           x:Class="DataPersistenceApp.AppShell">
        <ShellContent Title="Settings"
                      ContentTemplate="{DataTemplate local:SettingsPage}"
                      Route="settingspage" />
    
        <ShellContent Title="Secure Storage"
                      ContentTemplate="{DataTemplate local:SecureStoragePage}"
                      Route="securestoragepage" />
    </Shell>
    
  4. Run the App: Launch your application and navigate to the Secure Storage tab. You should be able to save and load passwords securely.


6. Data Flow in Xamarin.Forms

Overview

  1. User Interaction: The user interacts with the UI, entering data (e.g., username, theme, or passwords).

  2. Event Handling: Event handlers (e.g., SaveSettings_Clicked) process these interactions, storing data using Preferences or SecureStorage.

  3. Data Storage: Data is stored in the respective storage mechanism (key-value store for Preferences and secure storage for SecureStorage).

  4. Loading Data: When the user navigates back, data is loaded from storage and displayed in the UI (e.g., LoadSettings_Clicked).

Step-by-Step Example Data Flow

  1. User enters username and theme: The user types in "JohnDoe" and "blue" in the respective fields.

  2. Save Settings: The user clicks the "Save Settings" button, triggering SaveSettings_Clicked:

    • Preferences.Set("username", "JohnDoe")
    • Preferences.Set("theme", "blue")
  3. Data Storage: The values are saved in the application's storage.

  4. Load Settings: The user clicks the "Load Settings" button, triggering LoadSettings_Clicked:

    • Preferences.Get("username", "defaultUsername") returns "JohnDoe"
    • Preferences.Get("theme", "defaultTheme") returns "blue"
  5. UI Update: The loaded values are displayed in the UI.


7. Best Practices

  • Use Preferences for Non-Sensitive Data: Settings, themes, or any trivial information.
  • Use SecureStorage for Sensitive Data: Passwords, API keys, or any data that should remain confidential.
  • Handle Exceptions: SecureStorage might throw exceptions. Use try-catch to handle these gracefully.
  • Secure Key Naming: Avoid using predictable or common keys to prevent data leaks.
  • Regularly Update Libraries: Ensure Xamarin.Essentials and other dependencies are up to date for the latest security patches.

8. Conclusion

Xamarin.Forms simplifies data persistence with Preferences and SecureStorage. By following the steps outlined in this guide, you can easily integrate these mechanisms into your applications. Remember to handle data sensitivity appropriately and keep your libraries up to date for better security.

Feel free to explore more advanced topics, such as integrating with databases or cloud storage services, to enhance your application's data management capabilities. Happy coding!

Top 10 Questions and Answers on Xamarin.Forms Data Persistence: Preferences and SecureStorage

Data persistence is a crucial aspect of any mobile application, allowing developers to store and retrieve user data effectively and efficiently. Xamarin.Forms provides several built-in mechanisms for data persistence, such as Preferences and SecureStorage. Below are answers to the top 10 questions regarding these storage solutions:

1. What are the differences between Preferences and SecureStorage in Xamarin.Forms?

  • Preferences: A simple key-value storage system for storing small amounts of data such as settings, flags, or basic user preferences. It stores data in a way that is not secure, meaning that data can be easily accessed by users or other apps on the device.
  • SecureStorage: A more secure key-value storage system designed for storing sensitive information like user credentials or tokens. It encrypts the stored data, ensuring that it cannot be accessed by unauthorized parties easily.

2. When should I use Preferences versus SecureStorage in my Xamarin.Forms application?

  • Preferences: Ideal for storing general application settings, user preferences, or any non-sensitive data that does not require strong encryption.
  • SecureStorage: Essential for storing sensitive information that needs to be securely encrypted, like passwords, API keys, or authentication tokens.

3. How do I save a string using Preferences in Xamarin.Forms?

  • You can use the Preferences.Set method to save a string. Here’s an example:

    Preferences.Set("username", "JohnDoe");
    

4. How do I retrieve a string from Preferences in Xamarin.Forms?

  • Use the Preferences.Get method to retrieve a stored string. Supply a key and a default value in case the key does not exist:

    string username = Preferences.Get("username", "defaultUsername");
    

5. What is the best way to handle preferences that might not exist using Preferences in Xamarin.Forms?

  • Always provide a default value in the Preferences.Get method when retrieving a preference. This prevents exceptions and ensures that your application gracefully handles missing preferences:

    string userRole = Preferences.Get("role", "Guest");
    

6. How can I delete a saved preference in Xamarin.Forms?

  • Use the Preferences.Remove method to delete a specific preference:

    Preferences.Remove("username");
    

7. How do I use SecureStorage to save and retrieve a sensitive string in Xamarin.Forms?

  • To store a sensitive string using SecureStorage, use the SetAsync method, and to retrieve it, use the GetAsync method:

    // Save a sensitive string
    await SecureStorage.SetAsync("password", "securePassword123");
    
    // Retrieve a sensitive string
    string password = await SecureStorage.GetAsync("password");
    

8. What are the limitations or potential pitfalls of using SecureStorage in a Xamarin.Forms application?

  • Platform-Specific Behavior: SecureStorage might behave differently on different operating systems. For example, on iOS, it relies on the Keychain, while on Android, it uses the EncryptedSharedPreferences or the Keystore depending on the API level.
  • Performance: Secure encryption and decryption operations are computationally intensive and might impact the performance slightly if used excessively.
  • Data Size: Some platforms have limitations on the size of the data you can store in secure storage.

9. How can I handle platform-specific behaviors and limitations with SecureStorage?

  • Ensure you have the correct permissions set up in your platform-specific projects.
  • Be aware of the maximum storage size allowed for secure data and handle any exceptions related to exceeding that size.
  • Consider using platform-specific code (via DependencyService or Partial Classes) if you need to customize how secure storage is handled on each platform.

10. Can I use Preferences or SecureStorage to store complex data types, such as lists, dictionaries, or objects?

  • Preferences: Not directly. They are only capable of storing simple data types like strings, integers, booleans, etc. You would need to serialize the complex data into a string format using a method like JSON serialization before storing it, and deserialize it back afterward.
  • SecureStorage: Similar to Preferences, you cannot store complex data types directly. You must serialize them into a string, usually JSON, and store that string securely.

Conclusion

Xamarin.Forms offers powerful tools like Preferences and SecureStorage to manage data persistence across different platforms. While Preferences is suitable for non-sensitive data, SecureStorage offers a much-needed layer of security for sensitive information. By understanding these differences and their appropriate use cases, developers can ensure that their applications handle data efficiently and securely.