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

时间:2014-02-24 21:50:57

标签: 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

当我重新启动应用时, rootDataFolder.GetFolderAsync(...)时, GetDataFolder 功能失败,并显示以下消息:

  

目录不存在:/ data / data / com.quickshift / files / GameData

我会继续研究这个问题,几周前我曾经工作过,而且我从未改变过这段代码......

1 个答案:

答案 0 :(得分:0)

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

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

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