Enum to build SQLite database in Android
Over the past few days, I have search a "cleanest" way to manage a SQLite database. If the database contains only one table the simplest solution is to put directly into the
I have created two Enum types: Columns and Table.
The Columns is an Interface which contains an Enum for each table. This Enums are the list of the columns of a table, and have as a value the type of the the variable( INTEGER, REAL,TEXT...), in order to use it to get a piece of query with the getCreateQuery method.
SQLiteOpenHelper
a string query to create/update the table. With several tables, In my opinion, it isn't the smartest solution. So to build the sql query and manage the tables I have used Enum.I have created two Enum types: Columns and Table.
The Columns is an Interface which contains an Enum for each table. This Enums are the list of the columns of a table, and have as a value the type of the the variable( INTEGER, REAL,TEXT...), in order to use it to get a piece of query with the getCreateQuery method.
public interface Columns { String getCreateQuery(); public enum TableTest1 implements Columns { ID(INTEGER), COL1(TEXT), COL2(REAL) private final String value; private TableTest1(String value) { this.value = value; } @Override public String getCreateQuery() { return this.name() + SPACE + this.value; } } public enum TableTest2 implements Columns { ID(INTEGER), COL1(TEXT), COL2(REAL) private final String value; private TableTest1(String value) { this.value = value; } @Override public String getCreateQuery() { return this.name() + SPACE + this.value; } } }The second Enum is the list of tables. It contains as a value the corresponding elements in the Columns interface and an activity (I have put the activity because I have for each activity a table).
public enum Table { TABLE1(TableTest1.class, Activity1.class), TABLE2(TableTest2.class, Activity2.class), private Class value; private Class activity; private Table(Class columns, Class activity) { value = columns; this.activity = activity; } public Class getTableStrucrure() { return (Class) value; } public Class getActivity() { return activity; } private static final String CREATE = "CREATE TABLE "; private static final String FIRST = " ( ROWID integer primary key, "; private static final String LAST = ")"; public String getColumns() { StringBuilder sb = new StringBuilder(CREATE + this.name() + SPACE); sb.append(FIRST); Colonne[] values = value.getEnumConstants(); int length = values.length - 1; for (int i = 0; i < length; i++) { sb.append(values[i].getCreateQuery() + COMMA); } sb.append(values[length].getCreateQuery()); sb.append(LAST); return sb.toString(); } public static String[] getValues(int tipo2) { ListSo in the DBHelper class, to create the table:vals = new ArrayList (); for (Tabelle tb : Tabelle.values()) { if (tb.tipo == tipo2) { vals.add(tb.name()); } } Object[] temp = vals.toArray(); String[] names = new String[temp.length]; for (int i = 0; i < names.length; i++) { names[i] = temp[i].toString(); } return names; } }
public void onCreate(SQLiteDatabase db) { for (Table tb : Table.values()) { db.execSQL(tb.getColumns()); } }
Good job! I like how clear and auto-explicative your code is. A precious tool for people that want to learn to program with the Android OS like me!
ReplyDelete