1

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

我需要在应用启动时安装现有的 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

4

2 回答 2

5

确保您的应用程序文件夹之一中有您希望应用程序启动的数据库文件(如在 Visual Studio 解决方案资源管理器中可见的文件夹中)。在本例中,我将此文件夹称为“资产”

然后,您需要做的就是在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 类来简化对应用程序数据文件夹的访问,这是我上面使用的部分:

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;
        }
    }
}
于 2013-09-14T21:10:00.560 回答
2

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

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

于 2013-09-15T17:10:15.430 回答