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

如何在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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:32:34