Что лучше использовать для хранения и отображения значения из файла, который мы добавляем сами в AS?

222
10 февраля 2020, 07:30

Задача: получить рандомное значение(текстовый абзац) с файла, который мы сами добавляем в Android Studio. Абзацев в файле много. Получили случайный абзац -вывели его пользователю.

Что лучше использовать для этого? SQLite, json, assets или ещё что-нибудь?

Answer 1

Если текст не меняется, то самый простой и, пожалуй, удобный вариант - ресурсы) создаете обычный строковый ресурс, можно в отдельном файле, чтобы не превращать работу с strings.xml в симулятор вращения колесика(в папке values можно создавать произвольные файлы). Проставленные в файле ресурсов переносы строк aapt успешно устранит, а вот \n останутся и будут корректно обрабатываться, можно успешно отделить абзацы с их помощью. Если текст нужен не целиком - string-array поможет

SQLite представляется крайне неудобным вариантом. Готовую базу придется класть в ассеты, оттуда в рантайме копировать на диск и только из файла на диске открывать базу

json все равно нужно где-то хранить, что лишает его использование смысла

Хранение текстового файла в ассетах чуть удобнее, чем базы, но все равно придется открывать поток, копировать его содержимое в буфер и создавать из буфера строку

Если ресурсы не устраивают есть последний вариант - прописать статическими полями или статическим массивом. Но такой вариант не приветствуется, в т.ч. и самой андроид студией

Answer 2

Использовать хранение в файле всего текста несколько не практично, если этот файл вы не получаете в процессе работы программы (например из интернета), так как на разделение абзацев из целого текста потребуется существенный ресурс. Гораздо разумнее подготовить структуру на этапе создания приложения. Так же нет особого смысла использовать базу данных, JSON и подобное, так как на это так же потребуется дополнительная работа. Такое решение может быть оправдано при существенных объемах текста, когда проще поручить сортировать текст программе, чем самому.

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

Для этого создадим простой ресурс (назовем его paragraphs.xml и поместим в папку res/values/). Ресурс будет содержать текст наших абзацев в формате string-array для последующего преобразования в массив строк. Размещение в файле ресурса удобнее тем, что не забивает сам код, так же при необходимости можно очень просто реализовать поддержку разных языков средствами самой системы.

paragraphs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="paragraphs">
        <item>paragraph 1</item>
        <item>paragraph 2</item>
        <item>paragraph 3</item>
    </string-array>
</resources>

Далее простой код, который по нажатию на кнопку выводит в TextView случайный абзац:

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Button button;
    String [] paragraphs;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        button = findViewById(R.id.button);
        // получаем абзацы в массив
        paragraphs = getResources().getStringArray(R.array.paragraphs);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // генерируем случайное число в диапазоне полученного массива и выводим на экран
                textView.setText(paragraphs[new Random().nextInt(paragraphs.length)]);
            }
        });
    }
}

Код будет в случайном порядке выводить надписи: paragraph 1, paragraph 2, paragraph 3

READ ALSO
Внутренняя тень для LinearLayout

Внутренняя тень для LinearLayout

Никак не могу понять, как можно сделать внутреннюю теньЧтобы было так: Пытался сделать так:

185
Принцип generic типов Java

Принцип generic типов Java

Пытаюсь написать параметризуемый метод, принимающий параметризованные типы:

187
Заполнить таблицу enum с помощью JPA

Заполнить таблицу enum с помощью JPA

Есть два класса enum и класс содержащий его как атрибут

196
Почему у java нет парсера собственного кода?

Почему у java нет парсера собственного кода?

Сразу скажу, что знаю, есть, Javaparser проект, но он от сторонних разработчиковЯ просто не могу понять если java компилируется в байт-код из исходников,...

208