SQLite больше не работает на xamarin android - PullRequest
5 голосов
/ 29 мая 2019

У нас есть проект Xamarin.Forms, в котором нужно было использовать локальную базу данных sqlite для хранения даты.Библиотека sqlite от EF Core использовалась для ее настройки разными разработчиками с разных компьютеров (против 2019).Первоначально он использовался с функцией Database.EnsureCreated(), а затем с миграциями ядра ef.Все прошло гладко больше месяца.

На прошлой неделе приложение для Android неожиданно не запустилось ни на одном компьютере из-за ошибки в sqlite.Она показала следующую ошибку:

Фатальный сигнал 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, которые работали в прошлую пятницу (на всех ПК).Как только это исправление сработало, в этот день все прошло гладко.Во вторник проблема снова вернулась (никаких обновлений библиотеки или изменений кода).Более глубокий взгляд на регистрацию EF Cores показывает, что она падает в тот момент, когда пытается подключиться к БД.

Проблема может быть воспроизведена на устройствах Android, но не на эмуляторах.Я не уверен, есть ли какое-то новое разрешение в Android, которое мы должны запросить.

Наконец-то я создал новый проект форм xamarin с настройкой sqlite.Я использовал библиотеку pcl и ядро ​​ef.Я все еще нашел ту же ошибку.

Вот git-хаб, который повторяет проблему https://github.com/neville-nazerane/xamarin-site

Обновление

Просто то, что я заметил.Ранее файл моей базы данных назывался "main.db".Теперь независимо от того, что я изменяю это имя файла или независимо от того, какие переменные я изменяю.он всегда показывает имя базы данных как «главное» в журналах.Не уверен, что изменение имени базы данных решит проблему.Однако, никогда не находил способ изменить это имя БД.Я пробовал разные строки подключения, он просто сказал, что «database» и «db» были неизвестными ключами

Update

Шаги для репликации:

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

Определения Person и AppDbContext довольно очевидны.Таким образом, с духом не делая вопрос слишком длинным, я не размещаю это здесь.Тем не менее, при необходимости я могу опубликовать их тоже.

Ответы [ 3 ]

0 голосов
/ 04 июня 2019

Хорошо, приятель, я не понимаю, с какой проблемой ты сталкиваешься.Это может быть проблема с вашей машиной, я бы предложил использовать другой компьютер / ноутбук.

Я взял именно тот код, которым вы поделились на Github.Я смог собрать его на своем компьютере Mac в VS 2019 и установить приложение в режиме отладки на своем телефоне.Мне удалось успешно добавить дату, как вы можете видеть на картинке, и я установил точку захвата исключений и не обнаружил никаких исключений.App functioned perfectly

Затем я добавил еще одну запись с такими же подробностями, и она выдавала сообщение об ошибке, которое вы видите здесь Exception Catchpoint Error showing SQLite Exception

Я бы также предложил использовать Xamarin Profiler или любой другой регистратор Android, чтобы увидеть трассировку стека, которую вы не видите в выходных данных своего приложения.Он предоставит вам подробную информацию об ошибке, которую вы можете поделиться здесь, чтобы мы могли лучше понять.

0 голосов
/ 06 июня 2019

Это ошибка с 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

0 голосов
/ 03 июня 2019

Из-за небольших различий между отдельными файловыми системами на нативной стороне я бы предложил создать интерфейс для обработки фактической обработки файлов базы данных на уровне нативных приложений.

Итак, вот как я реализовал SQLite, используяпакет nuget SQLite.Net-PCL:

В общем проекте создайте новый интерфейс, например FileHandler.cs

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

Возможно, вы захотите расширить его, сохранив больше методов для сохраненияили получить различные файлы, но сейчас у нас будет только метод GetDbConnection для извлечения работающего соединения SQLite.

Теперь в вашей реализации Android мы добавим собственную реализацию к этому интерфейсу:

Создатьновый класс с именем FileHandler.cs в вашем проекте Android:

[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
}
...