.NET MAUI中打包只读SQLite数据库的实现疑问
.NET MAUI 内置只读SQLite数据库实现方案
一、代码放置与核心调整
直接把LoadMauiAsset的逻辑整合到你的TodoItemDatabase类里,替换原来的Init方法就行——原来的Init是创建新表,现在要改成从内置资源复制现成的数据库文件。
二、关键修改点
- 替换文件名:必须把代码里的
AboutAssets.txt换成你的数据库文件名,比如TodoDB.db。 - 调整逻辑为复制文件:原来的
LoadMauiAsset只是读取内容,你得改成把Resources/Raw里的数据库复制到应用本地可访问的路径,还要先判断本地是否已存在该文件,避免重复复制。
三、修改后的完整数据库类代码
using SQLite; using TodoSQLite.Models; using System.IO; namespace TodoSQLite.Data; public class TodoItemDatabase { SQLiteAsyncConnection Database; public TodoItemDatabase() { } async Task Init() { if (Database is not null) return; // 检查本地是否已有数据库,没有则从内置资源复制 if (!File.Exists(Constants.DatabasePath)) { using var stream = await FileSystem.OpenAppPackageFileAsync("TodoDB.db"); // 替换为你的数据库名称 using var fileStream = File.Create(Constants.DatabasePath); await stream.CopyToAsync(fileStream); } // 以只读模式连接数据库,阻止用户修改数据 Database = new SQLiteAsyncConnection(Constants.DatabasePath, SQLiteOpenFlags.ReadOnly); } // 示例查询方法 public async Task<List<TodoItem>> GetItemsAsync() { await Init(); return await Database.Table<TodoItem>().ToListAsync(); } }
四、额外注意事项
- 确保数据库文件的生成操作设置为
MauiAsset,否则无法被正确打包进应用。 Constants.DatabasePath需要指向应用的本地存储路径,示例代码如下:public static class Constants { public const string DatabaseFilename = "TodoDB.db"; public static string DatabasePath => Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename); }
内容的提问来源于stack exchange,提问作者rr944276
相关产品推荐
相关产品推荐

