Unity android build sqlite размер базы данных равен нулю байтов - PullRequest
0 голосов
/ 12 октября 2019

Я застрял при запуске Android-устройства Unity 3D на устройстве Android, он запускается в редакторе, но когда я создаю Android-приложение и пытаюсь запустить его на устройстве Android, в logcat появляются ошибки: no such file or directory и No such table приЯ пытаюсь получить доступ к базе данных с помощью кода, когда проверил мой файловый менеджер Android, я обнаружил, что размер базы данных равен нулю, что не должно быть, я думаю. Я сохранил базу данных в папке StreamingAssets, которая не пуста. Это мой код C # для настройки db:

#if !UNITY_EDITOR
        var filepath = string.Format("{0}/{1}", Application.persistentDataPath, DatabaseName);
        if (!File.Exists(filepath))
        {
            Utils.Log(LogType.Debug, "Database does not exist");
            string DatabaseName = Constants.Settings.dbName;

#if UNITY_ANDROID
        // open StreamingAssets directory and load the db ->
        var filepath = string.Format("{0}/{1}", Application.persistentDataPath, DatabaseName);
        var loadDb = new WWW("jar:file://" + Application.dataPath + "!/assets/" + DatabaseName);
        while (!loadDb.isDone) { }
        File.WriteAllBytes(filepath, loadDb.bytes);
#endif
        }

Даже я не вижу выше журнала в logcat "База данных не существует", кажется, он никогда не заходит внутрь блока, но как получается, что файл уже существовал в устройствеpersistentDataPath.

1 Ответ

1 голос
/ 12 октября 2019

Я считаю, что ваша проблема в том, что в какой-то момент, когда вы запустили файл, не существовало из-за no such file or directory (возможно, не удалось открыть ENOENT). Это происходит потому, что папка / каталог баз данных не существует, и копирование файла завершается неудачно

То есть базы данных Android хранятся в data / data / the_package_name / database / the_database_filename

Когда создается приложение, существует только каталог в data / data / the_package_name. ,Папка database отсутствует.

Если предпринята попытка открыть / получить доступ к базе данных, то будет создана папка базы данных (SDK / API делает это) и будет открыта база данных. НО это пустая строка таблицы sqlite_master и android_metadata и, следовательно, no such table.

С этого момента вы продолжите получать no such table, поскольку база данных существует и хранится на диске, но онане был скопирован.

Исправление:

a) изменить код так, чтобы внутри блока if была сделана проверка, чтобы увидеть, является ли родительский файл (базы данных )Каталог существует) и, если не использовать метод mkdirs файла перед копированием.

b) либо удалить приложение, либо b) очистить данные приложения.

  • Это необходимо для удаления бесполезной базы данных, которая препятствует копированию фактической базы данных.

c) перезапуск.

Однако, учитывая комментарии и Application.persistentDataPath возвращает / хранение / Эмуляция / 0 / Android / данные / com.mygame.cars / files / db_original.d , тогда вместо папки database это папка File , которая, вероятно, изначально не существует. Таким образом, вышеприведенное должно быть скорректировано в соответствии с папкой Files .

Другая проблема может заключаться в том, что включено autobackup , которое может восстанавливать данные приложения.

Это связано с функцией автоматического резервного копирования начиная с Android 6.0. Все данные вашего приложения автоматически копируются в вашу связанную учетную запись Google. Вы можете найти резервную копию в вашем Google Drive. По умолчанию резервные данные будут восстановлены после переустановки. Сохраненные файлы приложений Android автоматически восстанавливаются из ниоткуда даже после переустановки приложения.

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

...