c# - PCL中隔离存储的跨平台解决方案?

标签 c# android xamarin isolatedstorage portable-class-library

我目前正在为我的 Xamarin 应用程序使用最新版本的 PCLStorage,它在 Android 中运行不佳。每次加载我的应用程序时,它都无法找到我刚刚创建的目录。但它在我的 Windows 项目中运行良好。奇怪的...

有人知道与可移植类库兼容的好替代品吗?

谢谢!

更新 1

这是我使用的代码:

这些是保存/加载数据的函数:

 public static async Task<bool> LoadPlayerData()
 {
    PlayerData data = await LoadData<PlayerData>("PlayerState.dat");

    if (data != null)
    {
        PlayerData.Current = data;
        return true;
    }
    else
        return false;
 }

 public static async Task SavePlayerData()
 {
    IFolder dataFolder = await GetDataFolder(true);
    IFile file = await dataFolder.CreateFileAsync("PlayerState.dat", CreationCollisionOption.ReplaceExisting);

    string json = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(PlayerData.Current, Formatting.Indented));
    await file.WriteAllTextAsync(json);
 }

这些是使用 PCLStorage 完成工作的函数:

    private static async Task<T> LoadData<T>(string filename)
    {
        IFolder dataFolder = await GetDataFolder(false);

        if (dataFolder == null)
            return default(T);

        IFile file = null;

        try
        {
            // Catch the exception if the file doesn't yet exist
            file = await dataFolder.GetFileAsync(filename);
        }
        catch (PCLStorage.Exceptions.FileNotFoundException) { return default(T); }
        catch (System.IO.FileNotFoundException) { return default(T); }

        if (file == null)
            return default(T);

        string contents = await file.ReadAllTextAsync();

        T data = JsonConvert.DeserializeObject<T>(contents);

        return data;
    }

    private static async Task<IFolder> GetDataFolder(bool createIfNonExistent)
    {
        IFolder rootFolder = FileSystem.Current.LocalStorage;
        IFolder dataFolder = null;

        // Save actions will create the folder if it doesn't exist. Load actions will only try to get the folder.
        if (createIfNonExistent)
            dataFolder = await rootFolder.CreateFolderAsync("GameData", CreationCollisionOption.OpenIfExists);
        else
        {
            try
            {
                // Catch the exception if the folder doesn't yet exist
                dataFolder = await rootFolder.GetFolderAsync("GameData");
            }
            catch (PCLStorage.Exceptions.DirectoryNotFoundException) { return null; }
        }

        return dataFolder;
    }

在我的 Windows 8 项目中一切运行良好,但在 Android 中,当尝试加载刚刚创建的数据时(例如,当重新启动应用程序时),我总是得到一个 DirectoryNotFoundException在我的 GetDataFolder 函数中。

更新 2

SavePlayerData 函数中,我成功创建了文件,因为它包含以下路径:

/data/data/com.quickshift/files/GameData/PlayerState.dat

当我重新启动我的应用程序时,GetDataFolder 函数在调用 rootFolder.GetFolderAsync(...) 时失败并显示以下消息:

Directory does not exist: /data/data/com.quickshift/files/GameData

我会继续研究这个,几周前它曾经工作过,我从未更改过这段代码...

最佳答案

我不确定为什么该文件夹不存在。你能看看设备/模拟器上的文件系统,看看第一次运行后数据文件是否存在吗?

如果文件夹不存在,看起来您的 GetDataFolder 方法应该返回 null 而不是让异常通过。听起来 GetDataFolder 方法没有捕获从 GetFolderAsync() 抛出的 DirectoryNotFoundException。您能否尝试更改 catch block 以捕获 IOException 或 Exception 而不是 PCLStorage 的 DirectoryNotFoundException,看看这是否会改变行为?

异常是否从调用 GetFolderAsync(false) 的 LoadData 的第一行抛出?

关于c# - PCL中隔离存储的跨平台解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999804/

相关文章:

c# - 停止/退出定时器

c# - 合并 Entity Framework 中的迁移条目

c# - 单元测试 .Net CORE 2.0 WebAPI - 带有文本流正文的模拟(最小起订量)HTTP POST(非模型)

android - 如何以编程方式关闭 Android Speech To Text 对话框

android - 什么时候可以证明覆盖方向处理是合理的

service - Android 广播监听器中的 MvvmCross DataService

c# - http ://to https://redirect 期间的重定向循环

c# - 阅读器关闭时调用 HasRows 的尝试无效

android - 如何开始学习Android内核开发

ios - 在 Xamarin Studio 中针对较旧的 Mono 框架版本编译 iOS 应用程序