package com.evancharlton.mileage.io.output;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.widget.TextView;
import com.evancharlton.mileage.FillUpsProvider;
import com.evancharlton.mileage.Mileage;
import com.evancharlton.mileage.R;
import com.evancharlton.mileage.models.FillUp;
import com.evancharlton.mileage.models.Vehicle;
public class SQLView extends ExportView {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, "sql");
m_title = (TextView) findViewById(R.id.title);
m_title.setText(R.string.sql_file);
super.m_exporter = new Runnable() {
public void run() {
HashMap<String, String> fillupsProjection = FillUpsProvider.getFillUpsProjection();
HashMap<String, String> vehiclesProjection = FillUpsProvider.getVehiclesProjection();
Set<String> keySet = fillupsProjection.keySet();
String[] proj = keySet.toArray(new String[keySet.size()]);
SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/" + Mileage.PACKAGE + "/databases/" + FillUpsProvider.DATABASE_NAME, null, SQLiteDatabase.OPEN_READONLY);
Cursor c = db.query(FillUpsProvider.FILLUPS_TABLE_NAME, proj, null, null, null, null, FillUp._ID + " ASC");
StringBuilder sb = new StringBuilder();
sb.append("-- Exported database: ").append(FillUpsProvider.DATABASE_NAME).append("\n");
sb.append("-- Exported version: ").append(FillUpsProvider.DATABASE_VERSION).append("\n");
sb.append("-- Begin table: ").append(FillUpsProvider.FILLUPS_TABLE_NAME).append("\n");
c.moveToFirst();
while (c.isAfterLast() == false) {
sb.append("INSERT INTO ").append(FillUpsProvider.FILLUPS_TABLE_NAME).append(" ");
keySetToSQL(keySet, sb);
keySetToValues(keySet, sb, c);
c.moveToNext();
}
sb.append("-- End table: ").append(FillUpsProvider.FILLUPS_TABLE_NAME).append("\n");
sb.append("-- Begin table: ").append(FillUpsProvider.VEHICLES_TABLE_NAME).append("\n");
keySet = vehiclesProjection.keySet();
proj = keySet.toArray(new String[keySet.size()]);
c = db.query(FillUpsProvider.VEHICLES_TABLE_NAME, proj, null, null, null, null, Vehicle._ID + " ASC");
c.moveToFirst();
while (c.isAfterLast() == false) {
sb.append("INSERT INTO ").append(FillUpsProvider.VEHICLES_TABLE_NAME);
keySetToSQL(keySet, sb);
keySetToValues(keySet, sb, c);
c.moveToNext();
}
sb.append("-- End table: ").append(FillUpsProvider.VEHICLES_TABLE_NAME).append("\n");
c.close();
db.close();
// write to a file
try {
File output = new File(Environment.getExternalStorageDirectory() + "/" + getFilename());
FileWriter out = new FileWriter(output);
out.write(sb.toString());
out.flush();
out.close();
} catch (final IOException e) {
m_handler.post(new Runnable() {
public void run() {
Bundle data = new Bundle();
data.putString(MESSAGE, e.getMessage());
data.putString(TITLE, getString(R.string.error));
data.putBoolean(SUCCESS, false);
Message msg = new Message();
msg.setData(data);
m_handler.handleMessage(msg);
}
});
return;
}
m_handler.post(new Runnable() {
public void run() {
Bundle data = new Bundle();
data.putString(MESSAGE, getString(R.string.export_finished_msg) + "\n" + getFilename());
data.putString(TITLE, getString(R.string.success));
data.putBoolean(SUCCESS, true);
Message msg = new Message();
msg.setData(data);
m_handler.handleMessage(msg);
}
});
}
private void keySetToSQL(Set<String> columns, StringBuilder sb) {
sb.append(" (");
for (String key : columns) {
sb.append("'").append(key).append("', ");
}
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
sb.append(") ");
}
private void keySetToValues(Set<String> columns, StringBuilder sb, Cursor c) {
sb.append(" VALUES (");
int i = 1;
for (String key : columns) {
String val = c.getString(c.getColumnIndex(key));
if (val == null) {
val = "";
}
val = val.replaceAll("'", "\\'");
sb.append("'").append(val).append("'");
if (i != c.getColumnCount()) {
sb.append(", ");
}
i++;
}
sb.append(");\n");
}
};
}
@Override
protected String getHelp() {
return getString(R.string.help_export_sql);
}
@Override
protected String getHelpTitle() {
return getString(R.string.help_export_sql_title);
}
}