2012-01-18 5 views
2

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

Так может кто-то пожалуйста, скажите мне, если мои следующие выводы правильными или неправильными ?:

  • главная причина многих людей предполагают копирование предварительно заселена файл базы данных из папки активов в «/ данные/данные/YOUR_PACKAGE/databases/"есть потому, что есть никак не для доступа к файлу базы данных в папке с активами или делать это слишком сложно (?). (Может кто-то уточнить, какой из этих двух ответов является правильным?)
  • еще одна важная причина, по которой файлы базы данных в папке с ресурсами должны быть скопированы в другом месте, потому что файлы в этом месте не могут быть обновлены. Тогда даже если база данных в папке с ресурсами может быть открыта, это было бы полезно, только если такую ​​базу данных не нужно изменять. ОБНОВЛЕНИЕ:Я запустил новую тему, сосредоточенную только на этом вопросе:Opening a read only database directly in the assets folder.
  • Файлы в папке с ресурсами могут быть только размером 1 Мб (если у них нет определенных расширений файлов, таких как mp3). Обратите внимание, что это ограничение не имеет значения, если: ваша база данных меньше, чем 1 Мб, или вы не возражаете разделять вашу базу данных в кусках 1 МБ и сгруппировать их во время выполнения, или вы не против распространения файла базы данных с расширением mp3.
  • Если файл базы данных скопирован из папки активов в «/ data/data/YOUR_PACKAGE/databases /», нет способа удалить исходный файл базы данных в папке с ресурсами, чтобы избежать дублирования файла. Это также связано с тем, что файлы в папке с ресурсами не могут быть изменены.

Создание головоломки немного более сложная: я нашел в комментариях к принятому ответу этого вопроса: Ship an application with a database , что копирование базы данных из папки активов в другое место, на самом деле не работают на некоторых устройствах, работающих под управлением 2.3 +. Это точно? Если это так, то лучшей альтернативой может быть загрузка файла базы данных из Интернета при первом запуске?

Спасибо за любое разъяснение.

+1

прочитайте этот одноклассник http://www.mail-archive.com/[email protected]/msg28194.html существуют ограничения по размеру для ресурсов/необработанных папок. –

+1

все в папке с ресурсами статично и не может быть изменено, поэтому вам нужно скопировать. –

+0

активы, xml drawables и другие такие ресурсы являются частью apk, поэтому они не могут быть программно обновлены. И root-разрешение для просмотра данных - это «данные/данные» –

ответ

1

Вы по сути путаете apk с фактическими папками на своем устройстве.

Подумайте о пакете apk как о пакете установки - в отличие от msi от Windows-мира. Вся цель этого пакета установки - обеспечить надежную аутентификацию и доставку кода и ресурсов на ваше устройство. В наивной реализации вы затем распаковываете указанный код в место только для чтения, ресурсы где-то читаете-записываем и будьте на своем весерном пути.

Чтобы сэкономить место, Android немного умнее - код и ресурсы никогда не покидают подписанный архив, поэтому вы всегда знаете, что это то, что вы положили в, и вы не теряете места, сохраняя код дважды. В загрузчике классов есть настоящая магия, которая также позволяет разворачивать классы «на лету», но это не относится к делу.

Таким образом, все в этом сжатом пакете установки доступно только для чтения (в силу того, что оно также подписано). Это ваша задача быть «установщиком» и перемещать все ресурсы, необходимые вам для чтения и записи.Конечно, вы не можете прикоснуться к apk, как только он появится, так как это позволит вредоносным программам и полностью уничтожить цель подписания.

Надеюсь, это очистит путаницу.

+0

+1 Спасибо @Delyan, ваш ответ прояснил, почему все в АПК читается только. Но если предположить, что моя база данных только для чтения: есть ли способ открыть ее из своего исходного местоположения в apk (папка с ресурсами) без необходимости ее скопировать сначала в другое место? – Sergio

+0

Я не пробовал, но 'файл: /// android_asset/db.sqlite' может работать (обратите внимание на три слэша). Однако, если это не так, для ограничения этого ограничения потребуется несколько хакеров. – Delyan

+0

Я только что открыл отдельный поток для этой части моего вопроса: (http://stackoverflow.com/questions/8914673/opening-read-only-databases-in-the-assets-folder). Из того, что я задал изначально, мне все еще неясно, последний вопрос: если метод копирования файла базы данных в другое место по-прежнему действует, поскольку, по-видимому, было сообщено, что оно не работает на некоторых устройствах, работающих под управлением 2.3+ (как указано в ссылку на мой вопрос). Вы знаете что-то об этом @Delyan?. В любом случае вы ответили на большинство моих сомнений, поэтому я принимаю ваш ответ. – Sergio

Смежные вопросы