SQLite 似乎不再适用于 xamarin android

SQLite no longer seems to work on xamarin android

我们有一个 Xamarin.Forms 项目需要使用 sqlite 本地数据库来存储日期。 EF Core 的 sqlite 库用于设置它,并且由来自不同 PC 的不同开发人员使用(与 2019 相比)。最初,它与 Database.EnsureCreated() 函数一起使用,后来与 ef core 的迁移一起使用。一个多月一切顺利。

上周,由于 sqlite 的一些错误,android 应用程序突然无法在任何人的 PC 上启动。它显示以下错误:

Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)

我花了一段时间尝试各种修复和回滚,认为这是代码的问题。这包括以下内容:

  1. 已删除 obj 和 bin 文件夹,为以下所有步骤清理和重建。
  2. 将 ef 版本降级到 2.2.3(我们开始使用的版本)
  3. 回滚到 git 一周前提交
  4. 升级了ef core的依赖版本
  5. 删除了过去的几次迁移
  6. 已将 xamarin 表单降级为 3。6.x

在尝试了上述和其他几个修复之后,终于在上周五(在所有 PC 上)升级了 java 和 android SDK 的版本。一旦这个修复工作,那天一切都很顺利。周二,问题再次出现(没有库更新或代码更改)。更深入地查看 EF Core 日志记录表明它在尝试连接到数据库时崩溃了。

该问题可以在 android 设备上重现,但不能在模拟器上重现。我不确定 android 中是否有一些我们需要请求的新权限。

我终于用 sqlite 安装程序创建了一个新的 xamarin 表单项目。我使用了 pcl 库和 ef 核心。我仍然发现了同样的错误。

这是重现问题的 git 中心 https://github.com/neville-nazerane/xamarin-site

更新

只是我注意到的事情。早些时候我的数据库文件被命名为 "main.db"。现在,无论我将此文件名更改为什么,或者无论我更改什么变量。它总是在日志中将数据库名称显示为 "main"。不确定更改数据库名称是否可以解决问题。但是,从未找到更改此数据库名称的方法。我尝试了不同的连接字符串,它只是说 "database" 和 "db" 是未知键

更新

复制步骤:

using (var db = new AppDbContext())
{
    db.Add(new Person {
        Age = 55, 
        Name = "Neville"
    });
    db.SaveChanges();
    Person[] alldata = db.People.ToArray();
}

PersonAppDbContext的定义很明显。所以,本着不让问题太长的精神,我不post在这里。但是,如果需要,我也可以 post 他们。

由于本机端特定文件系统的细微差别,我建议创建一个接口来处理本机应用程序级别的实际数据库文件处理。

下面是我如何使用 nuget 包 SQLite 实现 SQLite。Net-PCL:

在共享项目中,新建一个界面,例如FileHandler.cs

public interface IFileHandler
{
    SQLite.SQLiteConnection GetDbConnection();
}

您可能希望使用更多方法来扩展它以保存或检索各种文件,但现在我们只使用 GetDbConnection 方法来检索有效的 SQLite 连接。

现在,在您的 Android 实现中,我们将本机实现添加到该接口:

在您的 android 项目中创建一个名为 FileHandler.cs 的新 class:

[assembly: Dependency(typeof(FileHandler))]
namespace YourProjectName.Droid
{
    public class FileHandler : IFileHandler
    {
        public SQLite.SQLiteConnection GetDbConnection()
        {
            string sqliteFilename = "YourDbName.db3";
            string path = Path.Combine(GetPersonalPath(), sqliteFilename);
            SQLiteConnectionString connStr = new SQLiteConnectionString(path, true);
            SQLiteConnectionWithLock connection = new SQLiteConnectionWithLock(connStr, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.NoMutex);
            return connection;
        }

        private string GetPersonalPath()
        {
            return Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        }
    }
}

现在再次回到您的共享代码中,您可以使用以下代码访问该连接:

using (SQLiteConnection connection = DependencyService.Get<IFileHandler>().GetDbConnection())
{
    // Do whatever you want to do with the database connection
}

好的,伙计,我不明白你遇到了什么问题。这可能是您机器的问题,我建议您使用另一个 computer/laptop.

我使用了您在 Github 上分享的确切代码。我能够在我的 Mac 计算机上使用 VS 2019 构建它,并在我的 phone 上以调试模式安装该应用程序。正如您在图片中看到的那样,我能够成功添加日期,并且我放置了一个 Exception Catchpoint 并且没有遇到任何异常。

然后我继续添加具有相同详细信息的另一个条目,它出错了,您可以在此处看到

我还建议使用 Xamarin Profiler 或任何其他 Android 记录器来查看您无法在应用程序输出中看到的堆栈跟踪。它将为您提供错误的详细信息,您可以在此处分享,以便我们更好地理解。

这是 Xamarin.Forms 和 Mono 的错误。

几个月前就检测到它,它已修复,但后来出现了一些回归(使用 VS 2019 v16.1)。

即使使用最新版本 (v16.1.2),错误仍然存​​在,因此我们需要等待修复。

来源:

https://github.com/mono/mono/issues/14170

https://github.com/xamarin/xamarin-android/issues/3112

https://github.com/xamarin/xamarin-android/issues/2920