【问题标题】:SQLite no longer seems to work on xamarin androidSQLite 似乎不再适用于 xamarin android
【发布时间】:2019-10-14 18:03:23
【问题描述】:

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

上周,由于 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中是否有一些新的权限。

我终于用 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();
}

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

【问题讨论】:

  • 您是否在模拟器和设备上检查了“FileSystem.AppDataDirectory”返回的文件路径,这很有可能在较新版本的 androids OS 中工作方式不同。
  • 感谢@Digitalsa1nt,但我已经在我的手机和 2 个不同的模拟器中尝试过了。他们有完全相同的字符串。其中一个模拟器也有 android 9.0 API 28,和我的手机一样。它仍然适用于两个模拟器,而不是我的手机
  • 我的项目也是如此!!!我记得周五早上我在测试 iOS 项目,做了一些调整。到了晚上,它停止在 Android 上运行。
  • 我记得最近重启了我的手机以安装更新。我不记得我到底是什么时候这样做的。
  • 顺便说一句,从 VS 16.1.4 开始,我可以再次调试我的应用程序了。

标签: xamarin.forms xamarin.android entity-framework-core sqlite-net-pcl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    以下是我使用 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
    }
    

    【讨论】:

    • 谢谢。但是这段代码甚至没有在 android 项目中使用 android 特定的代码。我看不出为此使用依赖服务的意义。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我在多台计算机上发现了这个问题。关于这个github问题。奇怪的是后来才开始工作。但是,我确实在多部手机和 PC 上遇到了这个问题
    • 您是否尝试使用分析器从崩溃中获取详细日志?另外我真的希望能够复制崩溃,我该怎么做?
    • @Saamer 我可以确认崩溃发生在多台计算机上,同时针对一个设备。
    • @NickeManarin 你想回答说你追溯到一个已知的 git 问题来要求 200 分吗?
    • 嗯,是的... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2020-04-04
    • 2023-04-06
    • 2017-08-01
    相关资源
    最近更新 更多