uporządkujmy troszkę – refaktoryzacja – #08

Zaczęłam dodawać kolejną tabelkę do mojej aplikacji i CoNaObiadDbHelper zaczął się niebezpiecznie rozrastać o kolejne stałe typu MEAL_TABLE_NAME, MEAL_COLUMN_NAME_NAME leżące bardzo blisko od DINNER_TABLE_NAME. Jakoś nie dawało mi to spokoju i postanowiłam wydzielić je do osobnej klasy.

Żeby wyglądało na to, że wiem co robię dodałam nowy package o nazwie model, bo jakoś tak mi wygodnie w strukturze MVC znanej z aplikacji webowych, albo MV?, którą możemy tu zastosować 😉

I jak tam zaczęłam to przenosić to dotarło do mnie, że ten obiekt MEAL, to jednak nie jest tym o czym myślałam pierwotnie i postanowiłam go przechrzcić na DINNER. Takie zmiany zdarzają się czasem.

Na początek stworzyłam sobie klasę DinnerContract.java i zaczęłam przenosić do niej stałe typu TABLE_NAME, COLUMN_NAME_NAME, SQL_CREATE_ENTRIES. Później utworzyłam klasę MealContract.java, zaczęłam do niej przenosić stałe… zatrzymałam się i utworzyłam sobie jeszcze jedną klasę, tym razem abstrakcyjną – na razie nazwaną BaseTable.java, choć waham się nad BaseContract.java -> wyjdzie w praniu.


package com.projects.jezinka.conaobiad.model;
public abstract class BaseTable {
String TABLE_NAME;
String SQL_CREATE_ENTRIES;
public String getDeleteEntriesQuery() {
return "delete from " + this.TABLE_NAME;
}
public String getDropTableQuery() {
return "drop table if exists " + this.TABLE_NAME;
}
public String getCreateEntriesQuery() {
return this.SQL_CREATE_ENTRIES;
}
public String getTableName() {
return this.TABLE_NAME;
}
}

view raw

BaseTable.java

hosted with ❤ by GitHub

Klasa MealContract.java z metodami dla siebie


public class MealContract extends BaseTable implements BaseColumns {
String COLUMN_NAME_NAME;
private String SQL_GET_ALL_RECORD;
public MealContract() {
this.TABLE_NAME = "meal";
this.COLUMN_NAME_NAME = "name";
this.SQL_CREATE_ENTRIES = "CREATE TABLE " + TABLE_NAME + " (" +
_ID + " INTEGER PRIMARY KEY," +
COLUMN_NAME_NAME + " TEXT)";
this.SQL_GET_ALL_RECORD = "select " + this.COLUMN_NAME_NAME + " from " + this.TABLE_NAME + " order by " + this.COLUMN_NAME_NAME;
}
public boolean insertMeal(Context context, String name) {
String tableName = this.getTableName();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
CoNaObiadDbHelper helper = new CoNaObiadDbHelper(context);
helper.insertValuesDbHelper(tableName, contentValues);
return true;
}
public ArrayList<String> getAllMeals(SQLiteOpenHelper helper) {
ArrayList<String> array_list = new ArrayList<String>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor res = db.rawQuery(this.SQL_GET_ALL_RECORD, null);
if (res != null && res.getCount() > 0) {
res.moveToFirst();
do {
String mealName = res.getString(res.getColumnIndex(this.COLUMN_NAME_NAME));
array_list.add(mealName);
} while (res.moveToNext());
}
db.close();
return array_list;
}
public boolean isAnyMealSaved(SQLiteOpenHelper helper) {
SQLiteDatabase db = helper.getReadableDatabase();
return queryNumEntries(db, "meal") > 0;
}
}

i klasa DinnerContract.java czekająca na swoje użycie


public class DinnerContract extends BaseTable implements BaseColumns {
String COLUMN_DATE_NAME;
String COLUMN_MEAL_ID;
public DinnerContract() {
this.TABLE_NAME = "dinner";
this.COLUMN_MEAL_ID = "meal_id";
this.COLUMN_DATE_NAME = "date";
this.SQL_CREATE_ENTRIES = "CREATE TABLE " + TABLE_NAME + " (" +
_ID + " INTEGER PRIMARY KEY," +
COLUMN_MEAL_ID + " INT, " +
COLUMN_DATE_NAME + " INT)"; // System.currentTimeMillis()
}
public boolean insertDinner(CoNaObiadDbHelper coNaObiadDbHelper, int mealID, Date date) {
return true;
}
}

i jakoś tak od razu mi lżej jak patrzę na odchudzony CoNaObiadDbHelper.java


public class CoNaObiadDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 5;
public static final String DATABASE_NAME = "CoNaObiad.db";
public CoNaObiadDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
BaseTable table = new MealContract();
db.execSQL(table.getCreateEntriesQuery());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
BaseTable table = new MealContract();
db.execSQL(table.getDropTableQuery());
onCreate(db);
}
public void cleanData() {
SQLiteDatabase db = this.getWritableDatabase();
BaseTable table = new MealContract();
db.execSQL(table.getDeleteEntriesQuery());
}
public void insertValuesDbHelper(String tableName, ContentValues contentValues) {
SQLiteDatabase db = this.getWritableDatabase();
db.insert(tableName, null, contentValues);
db.close();
}
}

Tylko jeszcze to pomieszanie konwencji nazewniczej, ale muszę nad tym jeszcze pomyśleć i dorobić gettery i settery jeśli zostawię je jako stałe – a tak by było chyba najbardziej poprawnie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.