精英似乎不再起作用xamarin android

时间:2019-05-29 07:32:02

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

我们有一个Xamarin.Forms项目,该项目需要使用sqlite本地数据库来存储日期。来自不同PC的不同开发人员使用EF Core的sqlite库进行设置(vs 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

在尝试了上述修复程序和其他修复程序之后,终于在上周五(在所有PC上)对java和android SDK的版本进行了升级。此修复程序奏效后,当天一切都会顺利进行。在星期二,问题再次出现(没有库更新或代码更改)。更深入地了解EF Cores日志记录表明,它在尝试连接到数据库时崩溃。

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

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

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

的git中心

更新

我发现了一些东西。早些时候,我的数据库文件名为“ main.db”。现在,无论我将该文件名更改为什么或更改任何变量。它在日志中始终将数据库名称显示为“ main”。不知道更改数据库名称是否可以解决该问题。但是,从未找到更改此数据库名称的方法。我尝试了不同的连接字符串,只是说“数据库”和“ db”是未知键

3 个答案:

答案 0 :(得分:0)

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

这就是我如何使用nuget包SQLite.Net-PCL实现SQLite的方法:

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

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

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

现在,在您的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
}

答案 1 :(得分:0)

好的伙伴,我不明白您面临的问题。可能是您的计算机有问题,建议您使用其他计算机/笔记本电脑。

我拿了您在Github上共享的确切代码。我能够在VS 2019的Mac计算机上构建它,并在手机上以调试模式安装了该应用程序。如您在图片中所见,我能够成功添加日期,并且放置了异常捕捉点,并且没有异常。 App functioned perfectly

然后我继续添加另一个具有相同详细信息的条目,并且出现错误消息,您可以在此处Exception Catchpoint Error showing SQLite Exception

看到此消息。

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

答案 2 :(得分:0)

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