Подтвердить что ты не робот

Заполнить базу данных Android из файла CSV?

Можно ли взять файл csv, хранящийся в каталоге res/raw resource, и использовать его для заполнения таблицы в базе данных sqlite3?

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

Я обнаружил, что есть команда импорта sqlite, которая позволяет это: Как импортировать файл .sql или .csv в SQLite?

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

db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
db.execSQL(".mode csv");
db.execSQL(".import res/raw/MyFile.csv " + TABLE_NAME); 

Возможно ли это?

Должен ли я пытаться использовать другой подход для заполнения моей базы данных?

UPDATE: Я отмечаю ответ Йозефа как ответ (объемная вставка с использованием транзакций), потому что он отлично работает и напрямую отвечает на мой вопрос, основываясь на моем названии (спасибо Josef). Тем не менее, я все еще ищу способ сделать объемную вставку в приложении Android из файла csv в таблицу sqlite3 с помощью оператора import. Если вы знаете, как это сделать, ответьте.

Спасибо за ответы!

4b9b3361

Ответ 1

Если вы хотите упаковать статические данные с вашим приложением, я рекомендую подготовить базу данных во время разработки (используя любую команду UI или csv-import, которая вам нравится) и отправку файла sqlite в папку с ресурсами. Затем вы можете просто скопировать весь файл sqlite на устройство при первом запуске приложения. Эти posts пронизывают эту идею, что, скорее всего, самый быстрый способ настройки база данных (скорость копирования файлов).

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

Ответ 2

Я потратил много времени на поиск простого решения и сам придумал этот маленький код. Для будущих людей, которые ищут это, как и я, вы можете использовать это:

BufferedReader in = new BufferedReader(your csv file source here);
String reader = "";
while ((reader = in.readLine()) != null){
    String[] RowData = reader.split(",");
    date = RowData[0];
    value = RowData[1];
    ContentValues values = new ContentValues();
    values.put(CsvProvider.DATE, date);
    values.put(CsvProvider.VALUE, value);
    getContentResolver().insert(CsvProvider.CONTENT_URI, values);
}
in.close();

Мой CSV файл не имеет заголовков и имеет только 2 столбца, но более двух столбцов не должно быть проблемой. Не забудьте указать, что разделяет ваши столбцы, и для каждого столбца добавить еще один RowData[#] (вам нужно начинать с 0). Вы хотите убедиться, что все, что вы собираетесь делать с каждой строкой, будет выполнено до вызова in.close(). Я использую контент-провайдера, но вы действительно можете делать все, что захотите, с такими данными, как добавление его в String[] или что-то еще.

Пока я использую поток ввода, вы можете указать BufferedReader туда, где хотите. Пока BufferedReader может его прочитать, он будет работать.