package nl.elastique.poetry.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.SQLException;
import java.util.HashMap;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private static final Logger sLogger = LoggerFactory.getLogger(DatabaseHelper.class);
private static DatabaseConfiguration sConfiguration;
protected static final HashMap<Class<?>, Dao<?, ?>> sCachedDaos = new HashMap<>();
public DatabaseHelper(Context context)
{
super(context, sConfiguration.getDatabaseName(), null, sConfiguration.getModelVersion());
}
public DatabaseHelper(Context context, DatabaseConfiguration configuration)
{
super(context, configuration.getDatabaseName(), null, configuration.getModelVersion());
sConfiguration = configuration;
}
public static void setConfiguration(DatabaseConfiguration configuration)
{
sConfiguration = configuration;
}
public static DatabaseHelper getHelper(Context context)
{
return OpenHelperManager.getHelper(context, DatabaseHelper.class);
}
public static <T extends DatabaseHelper> T getHelper(Context context, Class<T> classObject)
{
return OpenHelperManager.getHelper(context, classObject);
}
public static void releaseHelper()
{
OpenHelperManager.releaseHelper();
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource)
{
createDatabase();
}
public void createTable(Class<?> classObject)
{
try
{
TableUtils.createTable(getConnectionSource(), classObject);
}
catch (SQLException e)
{
sLogger.error(DatabaseHelper.class.getName(), "Can't create database", e);
throw new RuntimeException(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion)
{
recreateDatabase();
}
public <T> void dropTable(Class<T> classObject)
{
try
{
TableUtils.dropTable(getConnectionSource(), classObject, true);
if (sCachedDaos.containsKey(classObject))
{
sCachedDaos.remove(classObject);
}
}
catch (SQLException e)
{
sLogger.error("can't drop table", e);
}
}
public void recreateDatabase()
{
dropDatabase();
createDatabase();
}
/**
* Drops all tables.
*/
public void dropDatabase()
{
for (Class<?> classObject : sConfiguration.getModelClasses())
{
dropTable(classObject);
}
}
private void createDatabase()
{
for (Class<?> classObject : sConfiguration.getModelClasses())
{
createTable(classObject);
}
}
@Override
public <D extends com.j256.ormlite.dao.Dao<T,?>, T> D getDao(java.lang.Class<T> clazz) throws java.sql.SQLException
{
@SuppressWarnings("unchecked")
D dao = (D)sCachedDaos.get(clazz);
if(dao == null)
{
dao = super.getDao(clazz);
sCachedDaos.put(clazz, dao);
}
return dao;
}
}