Udostępnij za pośrednictwem


Migrowanie danych ze słownika właściwości aplikacji platformy Xamarin.Forms do preferencji .NET MAUI

Zestaw narzędzi Xamarin.Forms zawiera Properties słownik, którego można używać do przechowywania danych i do którego uzyskuje się dostęp przy użyciu Application.Current.Properties właściwości . Ten słownik używa klucza string i przechowuje wartość object. Wartości w słowniku są zapisywane na urządzeniu po wstrzymaniu lub zamknięciu aplikacji i załadowaniu po ponownym uruchomieniu aplikacji lub powrocie z tła. Aby uzyskać więcej informacji na temat słownika właściwości, zobacz Słownik właściwości.

Podczas migrowania aplikacji platformy Xamarin.Forms, która przechowuje dane w słowniku właściwości aplikacji do programu .NET MAUI, należy przeprowadzić migrację tych danych do preferencji .NET MAUI. Można to osiągnąć za LegacyApplication pomocą klasy i klas pomocnika, które przedstawiono w tym artykule. Ta klasa umożliwia aplikacji .NET MAUI w systemach Android, iOS i Windows odczytywanie danych ze słownika właściwości aplikacji utworzonego przy użyciu poprzedniej wersji platformy Xamarin.Forms aplikacji. Aby uzyskać więcej informacji na temat preferencji programu .NET MAUI, zobacz Preferencje.

Ważne

Nie ma interfejsu API, aby uzyskać dostęp do słownika właściwości aplikacji w programie .NET MAUI.

Uzyskiwanie dostępu do starszych danych właściwości aplikacji

Poniższy kod przedstawia klasę LegacyApplication , która zapewnia dostęp do danych właściwości aplikacji utworzonych przez aplikację Xamarin.Forms:

Uwaga

Aby użyć tego kodu, dodaj go do klasy o nazwie LegacyApplication w projekcie aplikacji .NET MAUI.

namespace MigrationHelpers;

public class LegacyApplication
{
    readonly PropertiesDeserializer deserializer;
    Task<IDictionary<string, object>>? propertiesTask;

    static LegacyApplication? current;
    public static LegacyApplication? Current
    {
        get
        {
            current ??= (LegacyApplication)Activator.CreateInstance(typeof(LegacyApplication));
            return current;
        }
    }

    public LegacyApplication()
    {
        deserializer = new PropertiesDeserializer();
    }

    public IDictionary<string, object> Properties
    {
        get
        {
            propertiesTask ??= GetPropertiesAsync();
            return propertiesTask.Result;
        }
    }

    async Task<IDictionary<string, object>> GetPropertiesAsync()
    {
        IDictionary<string, object> properties = await deserializer.DeserializePropertiesAsync().ConfigureAwait(false);
        properties ??= new Dictionary<string, object>(4);
        return properties;
    }
}

Android

W systemie Android LegacyApplication klasa używa PropertiesDeserializer klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer :

Uwaga

Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer w folderze Platforms\Android projektu aplikacji .NET MAUI.

using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        // Deserialize property dictionary to local storage
        return Task.Run(() =>
        {
            using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!store.FileExists(PropertyStoreFile))
                    return null;

                using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, FileMode.Open, FileAccess.Read))
                using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
                {
                    if (stream.Length == 0)
                        return null;

                    try
                    {
                        var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
                        return (IDictionary<string, object>)dcs.ReadObject(reader);
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine("Could not deserialize properties: " + e.Message);
                        Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                    }
                }
            }
            return null;
        });
    }
}

iOS

W systemie iOS LegacyApplication klasa używa PropertiesDeserializer klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer :

Uwaga

Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer w folderze Platforms\iOS projektu aplikacji .NET MAUI.

using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        // Deserialize property dictionary to local storage
        return Task.Run(() =>
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            using (var stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.OpenOrCreate))
            using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
            {
                if (stream.Length == 0)
                    return null;

                try
                {
                    var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
                    return (IDictionary<string, object>)dcs.ReadObject(reader);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("Could not deserialize properties: " + e.Message);
                    Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                }
            }
            return null;
        });
    }
}

Windows

W systemie Windows LegacyApplication klasa używa PropertiesDeserializer klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer :

Uwaga

Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer w folderze Platformy\Windows projektu aplikacji .NET MAUI.

using System.Diagnostics;
using System.Runtime.Serialization;
using Windows.Storage;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public async Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        try
        {
            StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(PropertyStoreFile).DontSync();
            using (Stream stream = (await file.OpenReadAsync().DontSync()).AsStreamForRead())
            {
                if (stream.Length == 0)
                    return new Dictionary<string, object>(4);

                try
                {
                    var serializer = new DataContractSerializer(typeof(IDictionary<string, object>));
                    return (IDictionary<string, object>)serializer.ReadObject(stream);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("Could not deserialize properties: " + e.Message);
                    Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                }
                return null;
            }
        }
        catch (FileNotFoundException)
        {
            return new Dictionary<string, object>(4);
        }
    }
}

Ta wersja PropertiesDeserializer systemu Windows klasy wymaga DontSync metody rozszerzenia. Poniższy kod przedstawia tę metodę rozszerzenia:

Uwaga

Aby użyć tego kodu, dodaj go do klasy o nazwie Extensions w folderze Platformy\Windows projektu aplikacji .NET MAUI.

using System.Runtime.CompilerServices;
using Windows.Foundation;

namespace MigrationHelpers;

internal static class Extensions
{
    public static ConfiguredTaskAwaitable<T> DontSync<T>(this IAsyncOperation<T> self)
    {
        return self.AsTask().ConfigureAwait(false);
    }
}

Korzystanie ze starszych danych właściwości aplikacji

Klasa LegacyApplication może służyć do korzystania z danych ze słownika właściwości aplikacji w systemach Android, iOS i Windows utworzonych przy użyciu poprzedniej wersji platformy Xamarin.Forms aplikacji:

#if ANDROID || IOS || WINDOWS
using MigrationHelpers;
...

int id;
if (LegacyApplication.Current.Properties.ContainsKey("id"))
{
    id = (int)LegacyApplication.Current.Properties["id"];
    Preferences.Set("id", id);
}
#endif

W tym przykładzie LegacyApplication pokazano użycie klasy do odczytania wartości ze słownika właściwości aplikacji, a następnie zapisanie wartości w preferencjach programu .NET MAUI.

Ważne

Przed uzyskaniem dostępu do niego zawsze sprawdź obecność klucza w słowniku właściwości aplikacji, aby zapobiec nieoczekiwanym błędom.