如何在Xamarin.Forms项目中导入本地SQLite数据库并验证连接是否成功建立
解决Xamarin Android导入本地SQLite数据库并验证连接的问题
先帮你梳理下当前的核心问题:数据库文件的放置位置不对,且连接代码没处理「从只读Assets目录复制数据库到应用可读写目录」的关键逻辑(Android的Assets目录无法直接读写),下面一步步来修正和验证:
1. 正确放置数据库文件到Android项目
- 打开你的Android项目,右键点击项目 → 添加 → 新建文件夹,命名为
Assets(已有则跳过) - 将
prototype.db复制到Assets文件夹中 - 选中
prototype.db文件,在右侧属性窗口设置:- Build Action:选择
AndroidAsset - Copy to Output Directory:选择
Copy if newer
- Build Action:选择
2. 修正DatabaseConnection的连接逻辑
当前代码直接去MyDocuments目录找数据库,但文件还未被复制到可读写区域,而且Assets目录无法直接连接,所以需要先完成复制操作,再建立连接。修改你的DatabaseConnection类代码:
using System; using System.IO; using Qooharitsa_Prototype_App.Connections; using Qooharitsa_Prototype_App.Droid; using SQLite; using Xamarin.Forms; using Android.Content.Res; [assembly: Dependency(typeof(DatabaseConnection))] namespace Qooharitsa_Prototype_App.Droid { class DatabaseConnection : IDatabaseConnection { public SQLiteAsyncConnection Connection() { // 获取应用专属的可读写目录(比MyDocuments更适合存储应用私有数据) var appDataPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); var dbPath = Path.Combine(appDataPath, "prototype.db"); // 如果目标路径没有数据库文件,从Assets复制过去 if (!File.Exists(dbPath)) { using (var assetStream = Application.Context.Assets.Open("prototype.db")) using (var fileStream = new FileStream(dbPath, FileMode.Create)) { assetStream.CopyTo(fileStream); } } return new SQLiteAsyncConnection(dbPath); } } }
3. 验证数据库连接是否成功
你可以通过以下几种方式快速验证:
方法一:执行简单查询并捕获异常
在共享项目的ViewModel或测试页面中添加测试方法:
using Qooharitsa_Prototype_App.Connections; using SQLite; public async Task TestDatabaseConnection() { try { var dbConnection = DependencyService.Get<IDatabaseConnection>().Connection(); // 替换成你数据库中实际存在的表名,执行计数查询 var recordCount = await dbConnection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM YourTargetTableName"); System.Diagnostics.Debug.WriteLine($"✅ 数据库连接成功!目标表共有{recordCount}条记录"); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"❌ 数据库连接失败:{ex.Message}"); // 异常信息会帮你定位问题,比如文件未复制、表名错误、SQLite版本不兼容等 } }
方法二:检查数据库文件是否成功复制
通过Android模拟器的文件管理器(或已root设备的文件浏览器),查看应用私有目录下是否存在prototype.db,路径大致为:/data/data/[你的应用包名]/files/
方法三:查询系统表验证数据库结构
可以查询SQLite的系统表,确认数据库中的表是否正常加载:
var tables = await dbConnection.QueryAsync<SQLiteConnection.TableInfo>("SELECT name FROM sqlite_master WHERE type='table';"); foreach(var table in tables) { System.Diagnostics.Debug.WriteLine($"已加载表:{table.Name}"); }
如果能输出你目标表的名称,说明数据库已正确导入并连接。
额外提示
虽然你说没使用SQLite-net-pcl,但代码里用到的SQLiteAsyncConnection其实属于SQLite-net系列库,确保你的NuGet包版本和数据库文件的SQLite版本兼容即可。
内容的提问来源于stack exchange,提问作者Dorian Setnik
相关产品推荐
相关产品推荐

