6

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

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

致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)

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

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

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

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

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

这是复制问题的 git hub https://github.com/neville-nazerane/xamarin-site

更新

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

更新

复制步骤:

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

Person和的定义AppDbContext非常明显。因此,本着不让问题太长的精神,我不会在这里发布。但是,如果需要,我也可以发布它们。

4

3 回答 3

2

这是 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

于 2019-06-06T17:53:55.523 回答
0

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

下面是我使用 nuget 包 SQLite.Net-PCL 实现 SQLite 的方法:

在共享项目中,创建一个新接口,例如 FileHandler.cs

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

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

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

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

[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
}
于 2019-06-03T09:17:08.103 回答
-1

好的朋友,我不明白你面临什么问题。这可能是您的机器的问题,我建议使用另一台计算机/笔记本电脑。

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

然后我继续添加另一个具有相同详细信息的条目,它错误地显示了您可以在此处看到的消息显示 SQLite 异常的异常捕获点错误

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

于 2019-06-03T23:18:53.663 回答