Не удалось открыть файл базы данных (неправильное использование) SqlLiteAsyncConnection - PullRequest
0 голосов
/ 16 июня 2019

Я получаю исключение "Не удалось открыть файл базы данных: [путь] (неправильное использование)" при попытке открыть соединение SQLite.

Я создаю приложение Xamarin.Forms и выполняю отладку в UWP, где я получаю исключение.

Конструктор для моего класса хранилища данных создает соединение и таблицы:

internal static string DBPath
{
    get
    {
        const string FILE_NAME = "TheRandomizer.db3";
        if (Device.RuntimePlatform == Device.Android)
        {
            return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), FILE_NAME);
        }
        else
        {
             return Path.Combine(ApplicationData.Current.LocalFolder.Path, FILE_NAME);
        }
    }
}

public SqliteDataStore()
{
    _database = new SQLiteAsyncConnection(DBPath, SQLiteOpenFlags.Create);
    // Fails trying to perform this action:
    _database.CreateTableAsync<GeneratorTable>().Wait();
    _database.CreateTableAsync<TagTable>().Wait();
}

Полный исходный код можно посмотреть здесь, на моем GitHub .

Трассировка стека:

в System.Threading.Tasks.Task.Wait (Int32 millisecondsTimeout, Отмена взята Отмена взята) в System.Threading.Tasks.Task.Wait () в TheRandomizer.Services.SqliteDataStore..ctor () в TheRandomizer.ViewModels.BaseViewModel.get_DataStore () в TheRandomizer.ViewModels.GeneratorListViewModel.ExecuteLoadItemsCommand ()

1 Ответ

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

Обновление

Я протестировал ваш код локально и увидел, что поведение действительно происходит, и после некоторой отладки, я думаю, у меня может быть две причины:

Во-первых, конструктор имеет только SQLiteOpenFlags.Create флаг.По-видимому, это не дает вам никаких других разрешений, включая чтение / запись.Вместо этого вы можете либо вообще пропустить этот второй аргумент:

_database = new SQLiteAsyncConnection(DBPath);

, либо включить явный флаг ReadWrite (я также включил флаг FullMutex, как рекомендуется для асинхронного соединения):

_database = new SQLiteAsyncConnection(
     DBPath, 
     SQLiteOpenFlags.Create | 
     SQLiteOpenFlags.FullMutex | 
     SQLiteOpenFlags.ReadWrite );

Вторая проблема возникает при создании таблицы GeneratorTable в БД.SQLite не знает, как хранить свойство Version, так как это пользовательский тип GeneratorVersion.Поэтому вам, вероятно, придется разбить его на простые свойства или добавить атрибут [Ignore].

Исходный ответ

Я проверил ваш исходный код и обнаружил, что вы пытаетесь сохранить базу данныхв папке Environment.SpecialFolder.Personal.Для UWP это фактически разрешается в C:\Users\$Username$\Documents, к которому приложение UWP не имеет доступа, так как оно работает в песочнице и не имеет доступа к нему.

Вместо этого вы должны использовать папку данных приложения (котораяВы, вероятно, на самом деле намеревались):

Path.Combine(ApplicationData.Current.LocalFolder.Path, FILE_NAME);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...