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,步骤如下:
- 将你的
DatabaseFile.db添加到UWP项目中(右键项目→添加→现有项)。 - 选中这个.db文件,在属性窗口设置:
- 生成操作:内容
- 复制到输出目录:如果较新则复制
- 在应用启动时,将文件从安装目录复制到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
相关产品推荐
相关产品推荐

