WedX - журнал о программировании и компьютерных науках

Поддержка Xamarin Forms Sqlite Android 7+

Для некоторых я использую плагин sqlite-net-pcl, но теперь для магазина воспроизведения требуется приложение как минимум для Android версии 7.

Когда я нацелен на это (Целевые версии Android - 7.1), приложение не может открыть / создать базу данных, она работает только для более низкой версии Android, такой как 5. Я знаю, что это могли быть изменения безопасности, которые могли вызвать это, но я понятия не имею, как с этим справиться.

Я получаю путь к данным для Android, вот так Path.Combine(global::Android.OS.Environment.ExternalStorageDirectory.Path, filename);

Затем при запуске мое приложение пытается открыть соединение с базой данных вот так

string dbPath = DependencyService.Get<IFileHelper>().GetLocalFilePath("myDbName.db3"); var conn = new SQLiteAsyncConnection(dbPath);

Я хочу использовать SQLiteAsyncConnection, поскольку он обрабатывает блокировки таблицы.

Исключение составляют:

Необработанное исключение: SQLite.SQLiteException: Could not open database file: /storage/emulated/0/myDbName.db3 (CannotOpen)

Я также удостоверился, что у меня отмечены флажки чтения и записи для разрешения внешнего хранилища. Я использую плагин https://github.com/praeclarum/sqlite-net, который это то, что формы xamarin рекомендуют в своей документации.


  • Все работает нормально с моей стороны после обновления до Android 8 имеет целевую версию. Обновлен ли ваш пакет sqllite nuget? 16.10.2018
  • Спасибо за ответ! 16.10.2018

Ответы:


1

Я думаю, что вы пытаетесь сохранить файл базы данных во внешнем хранилище. Вам нужно будет предоставить приложению разрешения на запись во внешнее хранилище (AppManifest -> Чтение / запись во внешнее хранилище). Как только вы это сделаете, вы можете включить разрешения в настройках устройства (Приложения -> [название приложения] -> Разрешения) в целях тестирования, или вы можете использовать Плагин разрешений Джеймса Монтемагно для включения чтения / записи в хранилище. Разрешения необходимо предоставить перед доступом к файлу базы данных.

Я тоже использую тот же плагин. Я настроил инициализацию базы данных (после запроса разрешений на хранение) следующим образом:

/* Request storage permissions first!! */

// After granting storage permissions...
string dbPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
string databaseFileName = "MyDatabase.db";
string fullDatabasePath = System.IO.Path.Combine(dbPath, databaseFileName);
_connection = new SQLiteConnection(fullDatabasePath);

Я не пробовал использовать SQLiteAsyncConnection, но это не должно иметь большого значения.

16.10.2018
  • Спасибо, Том, да, ты прав. Я не спрашивал разрешения у пользователя в первую очередь! Я начал с некоторого кода Android, чтобы запросить разрешение, но не было плагина. Плагин тоже кажется awaitable? (ждет, пока пользователь удовлетворит или отклонит запрос?) 16.10.2018
  • @ user3737964 Да, запросы разрешений awaitable, так как код должен ждать, пока пользователь предоставит / отклонит разрешения. Здесь вы можете найти пример реализации: github.com/jamesmontemagno/PermissionsPlugin#in-action. Вам просто нужно поставить необходимые вам разрешения (в вашем случае Хранилище). Не забудьте проверить, что разрешение было предоставлено, прежде чем пытаться получить доступ к каким-либо файлам / папкам! 17.10.2018

  • 2

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

    Как я уже говорил в аналогичном сообщении reddit .. Вы можете пропустить драму с разрешениями, если храните БД в личной папке приложения. Тогда вам не нужно запрашивать разрешения. Ознакомьтесь с этой официальной статьей , в котором объясняются разрешения для разных версий Android и, в частности, график в конце.

    17.10.2018
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]