Windows应用商店应用将SQLite文件放在LocalState文件夹中

时间:2013-09-14 20:46:24

标签: sqlite windows-phone windows-store-apps mvvmcross sqlite-net

我正在使用sql-net和mvvmcross构建一个Windows 8应用程序,以便对sqlite数据库进行数据访问。这适用于任何Win-8或Win-Phone应用程序。

我需要在app start上安装现有的sqlite文件。

使用连接时,您使用的语法如

 public FlashCardManager(ISQLiteConnectionFactory factory, IMvxMessenger messenger)
    {
        _messenger = messenger;
        _connection = factory.Create("Dictionary.sqlite");
        _connection.CreateTable<FlashCardSet>();
        _connection.CreateTable<FlashCard>();
    }

    public void CreateCard(FlashCard flashCard)
    {
        _connection.Insert(flashCard);

    }

该连接在以下位置创建文件:C:\ Users \ USER \ AppData \ Local \ Packages \ 793fd702-171e-474f-ab3b-d9067c58709b_ka9b83fa3fse2 \ LocalState

我的应用程序使用我创建的现有sqlite数据库文件。安装应用程序时,我需要将它放在此文件夹中。我该怎么做呢?

谢谢, JH

2 个答案:

答案 0 :(得分:5)

确保您拥有希望应用程序在您的某个应用程序文件夹中启动的数据库文件(如在visual studio解决方案资源管理器中可见的文件夹中)。对于此示例,我将此文件夹称为“Assets”

您需要做的就是在第一次运行应用时将此文件复制到LocalState文件夹。这可以在App.xaml.cs

中完成
private async void InitializeAppEnvironment()
    {
        try
        {
            if (!(await AppHelper.ExistsInStorageFolder(AppHelper.localFolder, dbName)))
            {
                StorageFile defaultDb = await AppHelper.installedLocation.GetFileAsync("Assets\\" + dbName);
                await defaultDb.CopyAsync(AppHelper.localFolder);
            }
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine(e);
        }
    }

我创建了一个AppHelper类来简化对app数据文件夹的访问,这里是我上面使用的部分:

static class AppHelper
{
    public static StorageFolder installedLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;
    public static StorageFolder localFolder = ApplicationData.Current.LocalFolder;

    public static async Task<bool> ExistsInStorageFolder(this StorageFolder folder, string fileName)
    {
        try
        {
            await folder.GetFileAsync(fileName);
            return true;
        }
        catch (FileNotFoundException)
        {
            return false;
        }
    }
}

答案 1 :(得分:2)

有关MVVM交叉的更详细回复,我在本次讨论中找到了有关跨平台文件放置的当前讨论:Link

目前的想法是,您必须为此类功能注入特定于平台的代码。