【问题标题】:Unable to open SQLite database file from local data store of UWP app无法从 UWP 应用的本地数据存储中打开 SQLite 数据库文件
【发布时间】:2020-02-13 15:41:29
【问题描述】:

我正在使用此官方 MSDN 教程的 this 部分:Use a SQLite database in a UWP app 但我收到以下错误:

备注:网上有很多与这个问题相关(或类似)的帖子,但似乎都没有解决办法。这些帖子中的大多数都是几年前的,所以我认为这个问题现在已经解决了。此外,上面提到的教程也是使用.NET Standard 类库项目。并且有关该问题的在线帖子没有涉及.NET Standard。所以,我想知道这个问题是否是由使用 .NET Standard 库引起的。无论如何,我们将不胜感激。

SQLite 错误 14:“无法打开数据库文件”

this 代码的 db.Open() 行发生错误

public static void InitializeDatabase()
{
    using (SqliteConnection db =
        new SqliteConnection("Filename=sqliteSample.db"))
    {
        db.Open();

        String tableCommand = "CREATE TABLE IF NOT " +
            "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
            "Text_Entry NVARCHAR(2048) NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

注意事项:

  1. 上述代码正下方的行显示为:This code creates the SQLite database and stores it in the application's local data store. 这意味着应用应该有权访问该本地数据存储。
  2. 我在Windows 10 上使用VS2019 的最新版本16.3.5。项目的目标版本选择为Windows 10 1903,最小版本选择为Windows 10 1903

更新

  1. 这个类似的官方 3 岁 sample 工作正常。因此,问题似乎与.NET Core 的较新版本有关。但我需要将最新版本的 .NET Core 用于我的应用正在使用的其他旧版本中不可用的功能。
  2. 我也尝试过这个类似的旧教程,但它在 .NET Core 的新版本上也没有工作 - 给出完全相同的错误。
  3. 2016 年hereMicrosoft 报告的老问题似乎在新版本的 .NET Core 中再次浮出水面。

【问题讨论】:

    标签: sqlite uwp


    【解决方案1】:

    这是个误区,SqliteConnection db = new SqliteConnection("Filename=sqliteSample.db")不能创建Sqlite文件,而是通过路径访问已有的Sqlite数据库文件。

    所以需要创建一个有效的sqliteSample.db文件,放在UWP项目的根目录下。在Properties -> Build operation中选择content,确保它会被加载到应用程序目录中。

    更新

    请先在LocalFolder 中创建sqliteSample.db 文件。

    await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
    

    然后使用路径访问数据库文件

    string path = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
        new SqliteConnection($"Filename={path}"))
    {
        // ...
    }
    

    最好的问候。

    【讨论】:

    • 我尝试了你的建议。现在我在代码createTable.ExecuteReader(); 的行上收到此错误:Microsoft.Data.Sqlite.SqliteException: 'SQLite Error 8: attempt to write a readonly database'.'。我去Windows资源管理器检查了db文件的权限,它不是只读的(也就是说,它是可写的)。
    • 出现这个问题的原因是UWP项目中内置的sqlite数据库文件在生成过程中会放在一个文件夹中,文件夹中的文件不能修改。这个问题很抱歉,我已经修改了答案,请检查
    • @RichardZhangMSFT 如果项目未使用.NET Standard 类库DataAccess,您的更新建议将起作用。但是由于SQLite相关代码要包含在DataAccess库中,我们如何使用ApplicationData类,因为那里没有Windows.Storage命名空间。请指教。
    • 您好,您不必将创建文件的过程放在类库中。比如你可以在UWP app上创建一个文件,将文件路径参数传递给InitializeDatabase()方法来初始化数据库。
    • 嗨@nam,我们已经更新了关于创建Sqlite数据库的文档,这里是new content,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多