You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP环境下SQLite数据库文件无法找到/创建及数据持久化问题咨询

嘿,作为在UWP里折腾过SQLite的开发者,我来帮你逐个理清问题:

1. SQLite完全能实现持久化数据存储

SQLite本身就是基于本地文件的关系型数据库,数据会持久保存在.db文件里,完全能达到你要的类似MySQL的持久化效果——区别只是MySQL是客户端/服务器架构,而SQLite是单文件嵌入式的,更适合移动端、桌面端的本地存储场景,只要你把数据库文件放在安全的可读写位置,每次连接它就能读写持久化的数据。

2. 你的代码没生成数据库文件的原因及修正

你的代码有两个关键问题导致文件没生成:

  • 路径权限问题:UWP运行在沙箱里,直接写"Filename=DatabaseFile.db"这种相对路径,默认会指向应用的安装目录,但这个目录是只读的,根本无法创建新文件。你需要把数据库文件放在应用的LocalFolder(本地存储目录,可读写,只有卸载应用时才会被删除)。
  • DDL语句执行方法错误:CREATE TABLE是数据定义语句,不需要返回结果集,你用ExecuteReader()会导致语句没有正确执行,应该用ExecuteNonQuery()来执行这类无返回结果的SQL语句。

修正后的代码示例:

using Windows.Storage;
using Microsoft.Data.Sqlite;
using System.IO;

public static async Task InitializeDatabaseAsync()
{
    // 获取应用本地存储目录的完整路径
    string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "DatabaseFile.db");

    using (SqliteConnection db = new SqliteConnection($"Filename={dbPath}"))
    {
        db.Open();
        // 用多行字符串更清晰,避免拼接错误
        string tableCommand = @"CREATE TABLE IF NOT EXISTS MyTable (
                                Primary_Key INTEGER PRIMARY KEY AUTOINCREMENT,
                                Text_Entry NVARCHAR(2048) NULL)";
        SqliteCommand createTable = new SqliteCommand(tableCommand, db);
        // 用ExecuteNonQuery执行DDL语句
        createTable.ExecuteNonQuery();
    }
}

调用的时候记得用await InitializeDatabaseAsync();,涉及文件系统操作时用异步方式更稳妥。

3. 如何使用自己预先创建好的.db文件

你自己创建的.db文件不能直接放在安装目录读写(因为安装目录只读),需要先复制到LocalFolder,步骤如下:

  1. 将你的DatabaseFile.db添加到UWP项目中(右键项目→添加→现有项)。
  2. 选中这个.db文件,在属性窗口设置:
    • 生成操作:内容
    • 复制到输出目录:如果较新则复制
  3. 在应用启动时,将文件从安装目录复制到LocalFolder(只需要第一次启动时复制),示例代码:
public static async Task CopyPrecreatedDbAsync()
{
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    // 检查LocalFolder里是否已经有这个db文件
    bool dbExists = await localFolder.TryGetItemAsync("DatabaseFile.db") != null;
    if (!dbExists)
    {
        // 获取项目中自带的db文件(ms-appx:///是应用安装目录的URI前缀)
        StorageFile dbFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///DatabaseFile.db"));
        // 复制到LocalFolder
        await dbFile.CopyAsync(localFolder);
    }
}

之后你就可以用前面修正后的代码,连接LocalFolder里的.db文件进行读写了。

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:16