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

.NET MAUI中打包只读SQLite数据库的实现疑问

.NET MAUI 内置只读SQLite数据库实现方案

一、代码放置与核心调整

直接把LoadMauiAsset的逻辑整合到你的TodoItemDatabase类里,替换原来的Init方法就行——原来的Init是创建新表,现在要改成从内置资源复制现成的数据库文件。

二、关键修改点

  1. 替换文件名:必须把代码里的AboutAssets.txt换成你的数据库文件名,比如TodoDB.db。
  2. 调整逻辑为复制文件:原来的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:55:05