Заполнить базу данных Android из файла CSV? - PullRequest
28 голосов
/ 22 мая 2010

Можно ли взять CSV-файл, хранящийся в каталоге ресурсов res / raw, и использовать его для заполнения таблицы в базе данных 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); 

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

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

ОБНОВЛЕНИЕ: Я отмечаю ответ Джозефа как ответ (массовая вставка с использованием транзакций), потому что он работает нормально и напрямую отвечает на мой вопрос на основе моего заголовка (спасибо Джозефу). Тем не менее, я все еще ищу способ сделать массовую вставку в приложении Android из CSV-файла в таблицу sqlite3, используя оператор импорта. Если вы знаете, как это сделать, пожалуйста, ответьте.

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

Ответы [ 2 ]

30 голосов
/ 22 мая 2010

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

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

14 голосов
/ 18 ноября 2010

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

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 может прочитать его, оно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...