SQLite Android Disk I / O Ошибка 10 (266) при создании базы данных - PullRequest
0 голосов
/ 09 ноября 2019

Я устанавливаю новое приложение Xamarin Forms (Android) с нуля и хочу реализовать базу данных SQLite с Entity Framework Core. Независимо от того, где я позволю EF Core создать базу данных, я получаю ошибку ввода-вывода диска SQLite 10 (расширенный код ошибки 266).

Примечание: (я уже создал приложения форм Xamarin с EF Core (SQLite), гдебаза данных может быть создана, так как я пытаюсь это сделать в этот раз, и никакой ошибки, как это произошло, не произошло)

  1. Я пытался переместить весь связанный с EF код из UI-потока, чтобы быть уверенным, что пользовательский интерфейс-Тред не блокирует путь к папке с приложениями или что-то в этом роде.

  2. Я пробовал разные пути для создания файла базы данных.

  3. Создание асинхронной / не асинхронной базы данных с помощью ef core.

  4. (я использую DI с Autofac) Я попытался удалить весь код, связанный с Autofac, и самостоятельно инициализировать необходимый DatabseContext.

  5. Я убедился, что у меня есть все необходимые разрешения для записи в файл / чтения из файла в Android.

(6. Я такжепытался по-разному регистрировать мои зависимости, чтобыAutofac или DI, как правило, не проблема сгенерированной ошибки)

В моем Android-приложении MainActivity я считываю путь к базе данных и передаю его в приложение Xamarin.Forms, например:

SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
string databasePath = Application.ApplicationContext.GetDatabasePath("target.db").AbsolutePath;

Я также создаю экземпляр AppSetup, который я использую для регистрации всех необходимых зависимостей с помощью autofac.

public AppSetup(string databasePath)
{
    _databasePath = databasePath;
}

public IContainer CreateContainer()
{
    var containerBuilder = new ContainerBuilder();
    RegisterDependencies(containerBuilder);
    return containerBuilder.Build();
}

protected virtual void RegisterDependencies(ContainerBuilder containerBuilder)
{
    containerBuilder.RegisterType<TargetContext>().As<ITargetContext>().WithParameter("databasePath", _databasePath).SingleInstance();
    containerBuilder.RegisterType<UnitOfWork>().As<IUnitOfWork>().SingleInstance();
    containerBuilder.RegisterType<SettingsRepository>().As<ISettingsRepository>().SingleInstance();
}

После того, как все это сделано, я создаю файл базы данных какэто в моем App.xaml.cs:

// Register types and create container
AppContainer.Container = setup.CreateContainer();

// Begin lifetime scope of container
using var scope = AppContainer.Container.BeginLifetimeScope();

var context = scope.Resolve<ITargetContext>();
context.Initialize();

В context.Initialize () я позволил ядру EF создать базу данных (если она еще не создана), и именно здесь выдается исключение:

public bool Initialize()
{
    bool result = Database.EnsureCreated();
    return result;
}

Примечание. Конфигурация DatabaseContext:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlite($"Filename={_databasePath}");

    base.OnConfiguring(optionsBuilder);
}

Я ожидаю, что ядро ​​EF может создать файл базы данных SQLite без каких-либо проблем. Я искал решение этой ошибки в течение нескольких дней, но ничто не могло помочь мне решить эту ошибку.

PS: трассировка стека, которую я получаю с этой ошибкой:

  at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC (System.Int32 rc, SQLitePCL.sqlite3 db) [0x0006d] in <99138fe6fbac4a1b964cb2ae266abca2>:0 
  at Microsoft.Data.Sqlite.SqliteConnection.Open () [0x00130] in <99138fe6fbac4a1b964cb2ae266abca2>:0 
  at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection (System.Boolean errorsExpected) [0x00068] in <f837de81a58c413490ebba0c6077cbc0>:0 
  at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open (System.Boolean errorsExpected) [0x00042] in <f837de81a58c413490ebba0c6077cbc0>:0 
  at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists () [0x0000c] in <971e586a59454fdbaaa76f95799fac73>:0 
  at Microsoft.EntityFrameworkCore.Storage.RelationalDatabaseCreator.EnsureCreated () [0x00008] in <f837de81a58c413490ebba0c6077cbc0>:0 
  at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureCreated () [0x0000b] in <6f7983df5846436f8e9cb779867785c7>:0 
  at Target.ServiceLayer.TargetContext.Initialize () [0x00002] in C:\Users\Nicklas\Source\Repos\XFTarget\Target\Target\ServiceLayer\TargetContext.cs:28 

РЕДАКТИРОВАТЬ (1): PS: я отлаживаю свое приложение на реальном устройстве, но другие примеры приложений ясозданные с помощью форм xamarin + ef core могут успешно создать свою базу данных на этом устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...