package com.ushahidi.platform.mobile.app.data.database; import com.ushahidi.platform.mobile.app.BuildConfig; import com.ushahidi.platform.mobile.app.data.database.converter.EnumEntityFieldConverter; import com.ushahidi.platform.mobile.app.data.database.converter.PostEntityConverter; import com.ushahidi.platform.mobile.app.data.entity.DeploymentEntity; import com.ushahidi.platform.mobile.app.data.entity.FormAttributeEntity; import com.ushahidi.platform.mobile.app.data.entity.FormEntity; import com.ushahidi.platform.mobile.app.data.entity.FormStageEntity; import com.ushahidi.platform.mobile.app.data.entity.GeoJsonEntity; import com.ushahidi.platform.mobile.app.data.entity.PostEntity; import com.ushahidi.platform.mobile.app.data.entity.PostFormEntity; import com.ushahidi.platform.mobile.app.data.entity.PostTagEntity; import com.ushahidi.platform.mobile.app.data.entity.PostUserEntity; import com.ushahidi.platform.mobile.app.data.entity.TagEntity; import com.ushahidi.platform.mobile.app.data.entity.UserEntity; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.support.annotation.NonNull; import android.util.Log; import nl.qbusict.cupboard.Cupboard; import nl.qbusict.cupboard.CupboardBuilder; import nl.qbusict.cupboard.CupboardFactory; import nl.qbusict.cupboard.convert.EntityConverter; import nl.qbusict.cupboard.convert.EntityConverterFactory; import static nl.qbusict.cupboard.CupboardFactory.cupboard; /** * Base Database helper class that all sqlite manipulation classes must inherit from * * @author Ushahidi Team <team@ushahidi.com> */ public abstract class BaseDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "ushahidi.db"; private static final int DATABASE_VERSION = 2; private static final int LAST_DATABASE_NUKE_VERSION = 1; private static final Class[] ENTITIES = new Class[]{DeploymentEntity.class, UserEntity.class, TagEntity.class, PostTagEntity.class, PostEntity.class, PostFormEntity.class, PostUserEntity.class, GeoJsonEntity.class, FormEntity.class, FormAttributeEntity.class, FormStageEntity.class}; private static final String TAG = BaseDatabaseHelper.class.getSimpleName(); static { EntityConverterFactory factory = new EntityConverterFactory() { @Override public <T> EntityConverter<T> create(Cupboard cupboard, Class<T> type) { if (type == PostEntity.class) { return (EntityConverter<T>) new PostEntityConverter(cupboard); } return null; } }; CupboardFactory.setCupboard(new CupboardBuilder() .registerFieldConverter(UserEntity.Role.class, new EnumEntityFieldConverter<>(UserEntity.Role.class)) .registerFieldConverter(TagEntity.Type.class, new EnumEntityFieldConverter<>(TagEntity.Type.class)) .registerFieldConverter(PostEntity.Status.class, new EnumEntityFieldConverter<>(PostEntity.Status.class)) .registerFieldConverter(PostEntity.Type.class, new EnumEntityFieldConverter<>(PostEntity.Type.class)) .registerFieldConverter(FormAttributeEntity.Input.class, new EnumEntityFieldConverter<>(FormAttributeEntity.Input.class)) .registerFieldConverter(FormAttributeEntity.Type.class, new EnumEntityFieldConverter<>(FormAttributeEntity.Type.class)) .registerEntityConverterFactory(factory).useAnnotations().build()); // Register our entities for (Class<?> clazz : ENTITIES) { cupboard().register(clazz); } } private boolean mIsClosed; /** * Default constructor * * @param context The calling context. Cannot be a null value */ public BaseDatabaseHelper(@NonNull Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public final void onCreate(SQLiteDatabase db) { // This will ensure that all tables are created cupboard().withDatabase(db).createTables(); } @Override public final void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < LAST_DATABASE_NUKE_VERSION) { if (BuildConfig.DEBUG) { Log.d(TAG, "Nuking Database. Old Version: " + oldVersion); } cupboard().withDatabase(db).dropAllTables(); onCreate(db); } else { // This will upgrade tables, adding columns and new tables. // Note that existing columns will not be converted cupboard().withDatabase(db).upgradeTables(); } } /** * Close database connection */ @Override public synchronized void close() { super.close(); mIsClosed = true; } protected boolean isClosed() { return mIsClosed; } }