Как обработать данные из файла CSV и поместить эти данные в базу данных комнаты и показать их в recylerview?

-4

Проверьте репозиторий https://github.com/vivekpanchal/BabyApp

Я читаю данные и обновляю адаптер как это

CSV файл находится внутри репо в папке Raw

нужна помощь в обработке данных CSV

private void readData() {
    InputStream is = getResources().openRawResource(R.raw.babynames);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );
    String line = "";

    try {
        reader.readLine();
        String mGender,mMeaning,mName,mOrigin;
        while ((line = reader.readLine()) != null) {
            Log.d("MyActivity", "Line: " + line);

            String[] tokens = line.split(",");

            mGender=tokens[1];
            mMeaning=tokens[2];
            mName=tokens[3];
            mOrigin=tokens[4];


            BabyName babyName=new BabyName(mGender,mMeaning,mName,mOrigin);
            babyName.setGender(mGender);
            babyName.setName(mName);
            babyName.setOrigin(mOrigin);
            babyName.setMeaning(mMeaning);
            database.babyDao().insert(babyName);
            babyNames.add(babyName);
            Log.d(TAG, "Just created: " + mGender+mMeaning+mName+mOrigin);

        }
    } catch (IOException e) {
        Log.wtf("MyActivity", "Error reading data file on line" + line, e);
        e.printStackTrace();
    }
}
Теги:
csv
android-studio
android-room

1 ответ

0
Лучший ответ

Я прошел через вашу ссылку проекта GitHub, ваш файл CSV имеет более 22 тыс. Записей. Другое дело, что вы не читаете данные из комнаты, вы только что ввели эти объекты и обновили адаптер с помощью ArrayList.

Прежде всего, вы не должны выполнять эту интенсивную работу CPU в основном потоке, это блокирует пользовательский интерфейс в течение длительного времени. [Только что протестированный код на моем устройстве]

Используйте рабочий поток или любой другой механизм потоковой передачи, такой как RxJava, для выполнения этой интенсивной работы CPU. Затем верните результат в главный поток и обновите свой пользовательский интерфейс.

Принимая это в дальнейшем, рассматривая записи 22K, вы должны рассмотреть возможность использования разбивки на страницы с библиотеками архитектуры Android

Выполняйте private void readData() в другом потоке, private void readData() список ваших объектов и вставляйте в базу данных все сразу. используя другой метод dao, как показано ниже

@Insert
void insertAll(List<BabyName> babyNames);

List<BabyName> в List<BabyName> используя database.babyDao().getAllData(); метод и в этом наблюдателе установите для BabyNames адаптер как adapter.setBabyNames(names) и call adapter.notifyDatasetChanged()

Вот как вы можете наблюдать LiveData - пример ProductFragment

// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
    @Override
    public void onChanged(@Nullable ProductEntity productEntity) {
        model.setProduct(productEntity);
       // Update adapter data and notify dataset changed here
    }
});

Если вы хотите следовать Руководствам по архитектуре Android, учитывая, что вы используете Database Room, перейдите к архитектуре MVVM. Вы запускаете задачу для обработки CSV после открытия приложения, и пользовательский интерфейс будет наблюдать за изменениями базы данных с помощью LiveData. Поэтому, когда ваша обработка csv завершена и база данных обновлена, вы можете просмотреть все, что в вашем пользовательском интерфейсе

Обратитесь к этой странице за поддержкой Pagination - Android Pagination

Редактировать 1

Я создаю Pull Request на GitHub, который исправляет эту проблему. Теперь приложение работает как ожидалось.

Он исправляет следующие проблемы

  • Обработка CSV в фоновом режиме
  • BabyDao с необходимыми методами LiveData
  • MainActivity with Observing Baby List
  • MainActivity обрабатывает CSV в фоновом режиме, если уже не вставлен
  • RecyclerView работает исправно - исправлена ошибка LayoutManager
  • 0
    Вы можете помочь мне с этим, как читать данные и обновлять интерфейс? я должен вызвать loaddata () в адаптере? подскажите пожалуйста как это сделать.
  • 0
    Обновленный ответ с шагами, которые вы можете предпринять, чтобы вставить данные и наблюдать их, используя LiveData в Activity
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню