Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Как правильно хранить куски текста в одном файле?

Есть файл с простой разметкой (как .ini). Разметка например такая:
[A1] 1=Текст A1-№1 2=Текст A1-№2
..........
[A2] 1=Текст A2-№1 2=Текст A2-№2
Как правильно и в какой папке хранить такие текстовые файлы, из которых я собираюсь формировать текст для вывода в TextView? Как формировать запрос на поиск нужного текста с такой разметкой? Может в JAVA есть аналог ini разметки?


Ответ

Для хранения произвольных файлов в структуре приложения Android выделены папки /assets и /res/raw. Доступ к этим ресурсам возможен только на чтение.
Различия кроются в способе доступа и организации хранения этих файлов.
Ресурсы в папке /assets могут иметь произвольную структуру подкаталогов, имен файлов и доступ к ним организуется через класс AssetManager, отдельные файлы не имеют идентификаторов в классе R.java, доступ к ним организуется напрямую по имени файла. Подробнее про ресурсы /assets
Ресурсы в папке /res/raw не могут иметь структуры подкаталогов, доступ к ним осуществляется по идентификатору, заданному в R.java, через синтаксис R.raw.*. Так же такие файлы несколько ограничены типом - разрешено хранить аудио, видео, html-страницы, текстовые файлы и тп. Подробнее о каталоге res/raw/
Кроме того, существует каталог /res/xml/, в котором можно хранить произвольные XML файлы (файлы структурированой информации, аналогичной той, которая представлена в вашем вопросе). Ресурсы так же имеют идентификаторы в R.java и обращаются к ним через R.xml.*. Подробнее
Перечисленные выше места хранения используются только для хранения статической информации - ее можно читать, но нельзя изменить или (до-)переписать. Если вам требуется доступ и на запись, то в таком случае файлы хранятся вне структуры приложения, на внешнем носителе. По умолчанию система Android выделяет для каждого приложения область на внешнем диске (по пути /data/data/), куда программа может записывать и считывать данные, но вы так же можете указать произвольное место работы (каталог), например, на SD-карте
Отличие в хранении в выделенной для приложения области в том, что эта область никаким образом недоступна другим приложениям (за исключением приложений с root-правами), так же при удалении приложения эта область удаляется вместе с ним. При хранении на SD-карте, доступ к данным может получить кто угодно и они не уничтожаются вместе с приложением при его деинсталяции.
Альтернативным способом хранения может быть запись значений в таблицу SQLite. Этот способ оправдан при необходимости делать произвольные выборки, а так же связывать различные данные (содержимое таблиц) между собой, так как организация работы с БД требует больших трудозатрат и дополнительных знаний в области СУБД - при простом хранении набора данных выгоднее и "дешевле" хранить его в структурированном файле. Тем не менее, вы так же можете подготовить БД и разместить ее в каталоге /assets, а затем скопировать на устройство (один из примеров). При этом база данных с которой могут работать классы Android может располагаться только в специальной выделенной области приложения по пути */data/data//database/*. При размещении в любом другом месте (например на SD-карте), Android не сможет с ней работать (либо вам придется написать свои классы работы с БД, которые смогут это делать). Размер самого файла БД несущественно больше размера хранимых в нем данных - этим в свете экономии места на диске можно пренебречь.
Аналоги INI файлов со встроенными в Android API инструментами для обработки - файлы форматов JSON и XML.
При довольно распространенном паттерне, когда требуется какой то заполненный данными файл, который потом необходимо модифицировать, поступают следующим образом: файл помещают в каталог /assets, при старте приложения его копируют оттуда в область выделенную приложению или на SD-карту и затем уже работают с скопированным файлом. Файл в /assets при этом остается в первоначальном состоянии и фактически является балластом, но ничего не поделаешь. Так же есть вариант создание файла динамически из кода, в некоторых случаях это позволяет существенно сократить объем приложения, то же относится и к заполнению таблиц SQLite.

Комментариев нет:

Отправить комментарий