Xamarin - 每个平台的共享存储 class

Xamarin - shared storage class for each platform

我目前正在探索 Xamarin,我尝试保存一些数据。 我在互联网上搜索,发现一些有趣的教程,例如 Xamarin(属性字典)给出的 one and this documentation

但是,有些事情我不明白。我在 Android 和 WinPhone(8.1, UWP) 下开发了一些应用程序并存储数据,我使用了 SharedPreferences (Android),这是一个 keys/string 和 XML 文件系统( serializer/deserializer) (WinPhone).

对于这个 Xamarin 应用程序,我想制作一个适用于所有平台的存储 class。经过搜索,我没有找到我可以在每个平台上使用的东西。

Application.Current.Properties["id"] = someClass.ID;

例如,我尝试使用这段代码来存储数据......我发现的唯一 'using' (Visual Studio 2015) 大约是 Android..

我的目标是做一个class那样的

public class Storage
{
    public void storeUser(User user)
    {
        Application.Current.Properties["username"] = user.username;
    }

    public User loadUser()
    {
        User user = new User();

        //Fill user with data

        return (user);
    }
}

我希望这个 class 是一个 "shared code class",它可以将数据保存到文件或其他任何东西(我不介意),并且可以在我的代码中的任何地方声明。然后我希望能够在 Android 或 iOS 或 WinPhone 上调用 Storage.storeUser(user);就像上面解释的那样简单。

感谢阅读和帮助!

试试这个插件

https://components.xamarin.com/view/SettingsPlugin

不要改写历史...

我假设您使用 xamarin.forms 因为您链接到该文档。

我使用 Daniel Plaisted 的 PCLStorage。你可以在 NuGet 上找到它。

我通常使用以下两种方法在静态 class 中进行。将 PCLStorage NuGet 包添加到您的 PCL 并添加

Using PCLStorage

您想反序列化您的对象并将字符串传递给此服务...当您阅读内容时,您只需将其序列化回对象即可。简单易行:)

    /// <summary>
    /// Reads content from a file
    /// </summary>
    /// <param name="filename">the name of the file</param>
    /// <param name="foldername">the name of the folder containing the file</param>
    /// <returns>string of the read content</returns>
    public static async Task<string> ReadFileContent(string filename, string foldername)
    {
        var rootFolder = FileSystem.Current.LocalStorage;
        IFolder specificFolder = await rootFolder.CreateFolderAsync(foldername, CreationCollisionOption.OpenIfExists);
        await specificFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
        ExistenceCheckResult exist = await specificFolder.CheckExistsAsync(filename);

        string text = null;
        if (exist == ExistenceCheckResult.FileExists)
        {
            IFile file = await specificFolder.GetFileAsync(filename);
            text = await file.ReadAllTextAsync();
        }
        return text;
    }

    /// <summary>
    /// Writes content to a file
    /// </summary>
    /// <param name="filename">the name of the file</param>
    /// <param name="foldername">the name of the folder containing the file</param>
    /// <param name="content">The content to be written to the file</param>
    /// <returns>returns true</returns>
    public static async Task<bool> WriteFileContent(string filename, string foldername, string content)
    {
        var rootFolder = FileSystem.Current.LocalStorage;
        IFolder specificFolder = await rootFolder.CreateFolderAsync(foldername, CreationCollisionOption.OpenIfExists);
        ExistenceCheckResult exist = await specificFolder.CheckExistsAsync(filename);

        string text = null;
        if (exist == ExistenceCheckResult.FileExists)
        {
            IFile file = await specificFolder.GetFileAsync(filename);
            await file.WriteAllTextAsync(content);
        }
        else
        {
            IFile file = await specificFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            await file.WriteAllTextAsync(content);
        }
        return true;
    }

如果你想改进它,你可以加入一些错误处理,比如 catch and try 块。但是我没有遇到任何问题。

如果您需要存储敏感数据,您还可以使用来自 xlabs 的安全存储。 https://github.com/XLabs/Xamarin-Forms-Labs

我实际上在我的应用程序中同时使用了两者。祝你好运