【问题标题】:Windows Store Application Place SQLite File in LocalState FolderWindows Store 应用程序将 SQLite 文件放在 LocalState 文件夹中
【发布时间】:2013-09-19 07:38:23
【问题描述】:

我正在使用 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

【问题讨论】:

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


    【解决方案1】:

    确保您的应用程序文件夹之一中有您希望启动应用程序的数据库文件(如在 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 类来简化对应用数据文件夹的访问,这是我上面使用的部分:

    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;
            }
        }
    }
    

    【讨论】:

    • 谢谢!我会在接下来几天回到我的项目时尝试一下。
    • 还要确保在文件属性中将您的数据库文件标记为“内容”,以便将其复制到调试和发布文件夹。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多