package de.westnordost.streetcomplete.data.osm.persist;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.Collection;
import de.westnordost.osmapi.map.data.Element;
public abstract class AOsmElementDao<T extends Element>
{
private final SQLiteOpenHelper dbHelper;
public AOsmElementDao(SQLiteOpenHelper dbHelper)
{
this.dbHelper = dbHelper;
}
public void putAll(Collection<T> objects)
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
for(T object : objects)
{
executeInsert(object);
}
db.setTransactionSuccessful();
db.endTransaction();
}
/* Adds or updates the given object to the database */
public void put(T object)
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
executeInsert(object);
db.setTransactionSuccessful();
db.endTransaction();
}
public void delete(long id)
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete(getTableName(), getIdColumnName() + " = " + id, null);
}
public T get(long id)
{
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(getTableName(), null, getIdColumnName() + " = " + id,
null, null, null, null, "1");
try
{
if (!cursor.moveToFirst()) return null;
return createObjectFrom(cursor);
}
finally
{
cursor.close();
}
}
/** Cleans up element entries that are not referenced by any quest anymore. */
public void deleteUnreferenced()
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
String where = NodeTable.Columns.ID + " NOT IN ( " +
"SELECT " + OsmQuestTable.Columns.ELEMENT_ID + " AS " + getIdColumnName() + " " +
"FROM " + OsmQuestTable.NAME + " " +
"WHERE " + OsmQuestTable.Columns.ELEMENT_TYPE + " = \"" + getElementTypeName() +"\"" +
")";
db.delete(getTableName(), where, null);
}
protected abstract String getElementTypeName();
protected abstract String getTableName();
protected abstract String getIdColumnName();
protected abstract void executeInsert(T object);
protected abstract T createObjectFrom(Cursor cursor);
}