Разбирать большие файлы csv java на Android

У меня есть файл csv, вам нужно перенести базу данных. Я создал класс для его разбора и передачи в базу данных, но он довольно медленный. Импорт занимает около трех минут. Есть ли способ сделать это быстрее? Прошу прощения за мой английский. Заранее спасибо!

final String[] SCANCODES = {"CODEPRODUCT", "SCANCODE"};
dbSync.importCSV(SCANCODES, "SCANCODES.CSV", "SCANCODES");  

////
.....
////

public void importCSV(String[] tableCol, String nameFile, String nameTable) {
        final File DATABASE_DIRECTORY = new File(
        Environment.getExternalStorageDirectory(), "ImportExport");
        final File PATH = new File(DATABASE_DIRECTORY,"SCANCODES.CSV");
        ContentValues cv = new ContentValues();
        BufferedReader br = null;
        String s = "";
        boolean skipLines = true;
        String[] data;
        db.beginTransaction();
        try {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(PATH), "Windows-1251"));
            while ((s = br.readLine()) != null) {
                //skip header
                   if (skipLines) {
                        skipLines = false;
                        continue;
                    }
                //- 1 not skip blank
                data = s.split(";", -1);
                for (int i = 0; i < data.length - 1; ++i) {
                    cv.put(tableCol[i], data[i]);
                }
                db.insert(nameTable, null, cv);
            }
            db.setTransactionSuccessful();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                db.endTransaction();
                br.close();
                new Folder().deleteFolder();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

РЕДАКТИРОВАТЬ Добавлена ​​кодировка


person Dmitriy Dzyuba    schedule 18.03.2014    source источник
comment
Вы должны указать кодировку при открытии Reader   -  person fge    schedule 18.03.2014


Ответы (1)


Есть метод bulkInsert. Это должно немного улучшить производительность.

Насколько я понимаю, вы читаете этот файл .csv локально. Вместо того, чтобы читать файл .csv, вы можете отправить APK с действительной базой данных SQLite в папку assets, а затем просто переместить файл в папку баз данных, как описано в приведенной ниже ссылке:

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

person tasomaniac    schedule 18.03.2014
comment
У меня есть такие файлы, это средство обмена данными. Они постоянно обновляются, и мне приходится вводить их при каждом переходе. Метод bulkInsert попробую, спасибо. - person Dmitriy Dzyuba; 18.03.2014
comment
Если вы получаете данные онлайн, я не вижу никакой другой оптимизации, кроме bulkInsert(). Вы также можете сделать это. Сделайте этот длинный вызов в фоновом режиме и отобразите progreassdialog, чтобы пользователь дождался завершения операции. - person tasomaniac; 18.03.2014
comment
Думал сделать файл сопоставленным с памятью, но у меня данные разной длины и установить буфер чтения не могу( Спасибо за помощь попробую. - person Dmitriy Dzyuba; 18.03.2014