【问题标题】:Load an existing database to Universal app将现有数据库加载到通用应用程序
【发布时间】:2014-07-02 18:52:54
【问题描述】:

我正在尝试在 Universal 8.1 应用中加载现有数据库文件。

我安装了所有必需的包,我正在使用SQLitePCL 包装器。

当我尝试使用此命令打开 db 文件时:

conn = new SQLiteConnection("test.db");

它正在创建一个新的空数据库。 (我的意思是,每个SELECT 命令都失败,没有这样的表错误。所以它不是我的数据库,它是一个新的。)

还有,

conn = new SQLiteConnection("ms-appx:///test.db");

抛出此异常:

无法打开数据库文件:ms-appx:///test.db 详细信息:无法打开数据库文件

我的 test.db 位于 Shared 项目的根目录中,Build Action 设置为 ContentCopy to Output Directory 设置为 If Newer

我不确定我做错了什么。你能帮帮我吗?

  • 如果这是一个愚蠢的问题,请接受我的歉意,我是 WinRT 编程的新手。

【问题讨论】:

    标签: c# sqlite windows-runtime windows-8.1 win-universal-app


    【解决方案1】:

    有一个关于sqlite-net 包装器的解决方案,它也适用于SQLitePCLhttp://wp.qmatteoq.com/import-an-already-existing-sqlite-database-in-a-windows-8-application/

    总结是,那些包装器在LocalStorage 文件夹中查找数据库。因此,您需要先将文件复制到LocalStorage,然后才能访问数据库。

    private async Task CopyDatabase()
    {
        bool isDatabaseExisting = false;
     
        try
        {
            StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("people.db");
            isDatabaseExisting = true;
        }
        catch
        {
            isDatabaseExisting = false;
        }
     
        if (!isDatabaseExisting)
        {
            StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("people.db");
            await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
        }
    }
    

    之后,就可以使用这行代码访问数据库了:

    conn = new SQLiteConnection("test.db");
    

    但是,问题是我将在手机中存储两个数据库文件实例。我不知道如何解决这个问题。谁能帮忙?

    【讨论】:

    • people.db 的属性Build Action 必须是Content。如果未设置,则数据库不包含在应用程序中。
    • 我应该把我的“people.db”放在项目的什么地方? ...我应该把它放在 Asset 文件夹中,还是应该为它创建一个自定义文件夹或者它应该放在根文件夹中?任何人都可以帮忙。
    猜你喜欢
    • 2011-02-09
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多