package com.evancharlton.mileage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Set; import android.database.sqlite.SQLiteDatabase; import android.os.Handler; import android.os.Message; public class CSVImporter implements Runnable { private Handler m_handler; public CSVImporter(Handler handler) { m_handler = handler; } public void run() { File input = new File("/sdcard/mileage.csv"); try { FileReader in = new FileReader(input); StringBuilder sb = new StringBuilder(); int c; while ((c = in.read()) != -1) { sb.append((char) c); } in.close(); String data = sb.toString(); String[] lines = data.split("\n"); for (int i = 0; i < lines.length; i++) { lines[i] = lines[i].trim(); } // get the headers String[] columns = explode(lines[0]); // get the data ArrayList<HashMap<String, String>> rows = new ArrayList<HashMap<String, String>>(); for (int i = 1; i < lines.length; i++) { String[] d = explode(lines[i]); HashMap<String, String> row = new HashMap<String, String>(); for (int j = 0; j < columns.length; j++) { row.put(columns[j], d[j]); } rows.add(row); } insertRows(rows); m_handler.post(new Runnable() { public void run() { Message msg = new Message(); msg.what = 0; msg.arg1 = R.string.import_done_msg; msg.arg2 = R.string.import_done; msg.obj = "mileage.csv"; m_handler.handleMessage(msg); } }); } catch (final FileNotFoundException e) { m_handler.post(new Runnable() { public void run() { Message msg = new Message(); msg.what = 0; msg.obj = e.getLocalizedMessage(); msg.arg2 = R.string.error_importing_data; m_handler.handleMessage(msg); } }); } catch (final IOException e) { m_handler.post(new Runnable() { public void run() { Message msg = new Message(); msg.what = 0; msg.obj = e.getLocalizedMessage(); msg.arg2 = R.string.error_importing_data; m_handler.handleMessage(msg); } }); } } @SuppressWarnings("unchecked") private void insertRows(ArrayList<HashMap<String, String>> rows) { HashMap<String, String> fillupsProjection = FillUpsProvider.getFillUpsProjection(); Set<String> keySet = fillupsProjection.keySet(); keySet.remove(FillUps._ID); SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/" + Mileage.PACKAGE + "/databases/" + FillUpsProvider.DATABASE_NAME, null, SQLiteDatabase.OPEN_READWRITE); for (HashMap<String, String> row : rows) { StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO ").append(FillUpsProvider.FILLUPS_TABLE_NAME).append(" ("); HashMap<String, String> rowClone = (HashMap<String, String>) row.clone(); for (String key : row.keySet()) { if (keySet.contains(key)) { sb.append("'").append(key).append("', "); } else { rowClone.remove(key); } } sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); sb.append(") VALUES ("); String[] data = new String[rowClone.keySet().size()]; int i = 0; for (String key : rowClone.keySet()) { String val = rowClone.get(key); if (val == null) { val = ""; } data[i++] = val; sb.append("?"); if (i != data.length) { sb.append(", "); } } sb.append(");"); db.execSQL(sb.toString(), data); } db.close(); } private String[] explode(String str) { String[] columns = str.split(","); // remove the quotes for (int i = 0; i < columns.length; i++) { int len = columns[i].length(); columns[i] = columns[i].substring(1, len - 1); } return columns; } }