如何在Xamarin中嵌入SQLite?嵌入式资源.db文件无法定位求助
解决嵌入式SQLite数据库文件找不到的问题
我之前在跨平台项目里也踩过完全一样的坑!你现在的核心问题是搞混了嵌入式资源和普通文件的读取逻辑——嵌入式资源是打包进程序集里的,根本不存在于文件系统中,所以你用File.Exists或者直接拼接路径肯定找不到!而你的appsettings.json能正常读取,大概率是因为它被设置成了「复制到输出目录」,是作为独立文件存在的,和.db的处理逻辑完全不同。
下面是我亲测有效的解决步骤:
1. 先确认嵌入式资源的正确名称
嵌入式资源的全名是「项目命名空间 + 文件名」,比如你的共享项目命名空间是MyApp.Shared,数据库文件叫dbfilename.db,那资源的完整名称就是MyApp.Shared.dbfilename.db。你可以先打印所有资源名来确认:
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(YourSharedProjectClass)).Assembly; var allResources = assembly.GetManifestResourceNames(); // 用Debug输出所有资源名,找到你的db文件的正确全称 foreach (var name in allResources) { Debug.WriteLine($"Resource Name: {name}"); }
这里的YourSharedProjectClass是你共享项目里的任意一个类,用它来获取程序集会比GetExecutingAssembly更可靠,尤其是跨平台场景。
2. 把嵌入式资源复制到本地存储
因为SQLite需要操作实际的文件,所以你得先把程序集里的资源流读取出来,写入到应用的私有存储目录,然后再连接这个本地文件:
// 获取程序集和资源流 var assembly = IntrospectionExtensions.GetTypeInfo(typeof(YourSharedProjectClass)).Assembly; var resourceStream = assembly.GetManifestResourceStream("你的资源完整名称,比如MyApp.Shared.dbfilename.db"); // 定义本地存储路径(跨平台兼容,Android/iOS都会指向应用私有目录) var localDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "dbfilename.db"); // 只在第一次运行时复制,避免每次覆盖现有数据库 if (!File.Exists(localDbPath)) { using (var fileStream = new FileStream(localDbPath, FileMode.Create)) { resourceStream.CopyTo(fileStream); } }
3. 连接本地数据库文件
现在就可以正常连接这个本地路径的数据库了:
using (var con = new SqliteConnection($"DataSource={localDbPath}")) { con.Open(); var cmd = con.CreateCommand(); cmd.CommandText = "SELECT * FROM Table;"; var reader = cmd.ExecuteReader(); while (reader.Read()) { // 处理读取的数据 } }
最后再检查几个关键配置
- 确认你的.db文件属性:生成操作=嵌入式资源,复制到输出目录=不复制(既然已经嵌入程序集,就不需要再复制了)
- 如果是Android项目,确保没有在Android的Assets文件夹里重复放这个文件,避免混淆
- 资源名称的大小写要注意,有些平台对大小写敏感(比如Android)
内容的提问来源于stack exchange,提问作者Rickard
相关产品推荐
相关产品推荐

