/**
* Copyright (C) 2013 Romain Guefveneu.
*
* This file is part of naonedbus.
*
* Naonedbus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Naonedbus is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.naonedbus.manager;
import java.util.ArrayList;
import java.util.List;
import net.naonedbus.provider.table.LigneTable;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
public abstract class SQLiteManager<T> {
private final Uri mContentUri;
protected SQLiteManager(final Uri contentUri) {
mContentUri = contentUri;
}
public Long add(final ContentResolver contentResolver, final T item) {
final Uri uri = contentResolver.insert(mContentUri, getContentValues(item));
return Long.valueOf(uri.getLastPathSegment());
}
public void remove(final ContentResolver contentResolver, final long id) {
contentResolver.delete(mContentUri, "_id = ?", new String[] { String.valueOf(id) });
}
/**
* Récupérer un cursor contenant tous les éléments
*
* @param contentResolver
* @return un cursor
*/
public Cursor getCursor(final ContentResolver contentResolver) {
return contentResolver.query(mContentUri, null, null, null, null);
}
/**
* Récupérer un cursor de la sélection donnée
*
* @param contentResolver
* @param selection
* @param selectionArg
* @return un cursor
*/
public Cursor getCursor(final ContentResolver contentResolver, final String selection, final String[] selectionArg) {
return contentResolver.query(mContentUri, null, selection, selectionArg, null);
}
/**
* Récupérer tous les éléments
*
* @param contentResolver
* @param selection
* @param selectionArg
* @return une liste des éléments
*/
public List<T> getAll(final ContentResolver contentResolver, final String selection, final String[] selectionArg) {
final Cursor c = getCursor(contentResolver, selection, selectionArg);
return getFromCursor(c);
}
/**
* Récupérer tous les éléments, sans filtre possible.
*
* @param contentResolver
* @return la liste de tous les éléments de la table
*/
public List<T> getAll(final ContentResolver contentResolver) {
final Cursor c = getCursor(contentResolver, null, null);
return getFromCursor(c);
}
/**
* Récupérer un élément selon la sélection
*
* @param contentResolver
* @param selection
* @param selectionArg
* @return un élément
*/
public T getSingle(final ContentResolver contentResolver, final String selection, final String[] selectionArg) {
final Cursor c = getCursor(contentResolver, selection, selectionArg);
return getFirstFromCursor(c);
}
/**
* Récupérer un élément selon son id
*
* @param contentResolver
* @param id
* @return un élément
*/
public T getSingle(final ContentResolver contentResolver, final int id) {
final Cursor c = getCursor(contentResolver, "_id = ?", new String[] { String.valueOf(id) });
return getFirstFromCursor(c);
}
/**
* Récupérer un élément selon son code.
*
* @param contentResolver
* @param code
* @return un élément
*/
public T getSingle(final ContentResolver contentResolver, final String code) {
final Cursor c = getCursor(contentResolver, "code = ?", new String[] { code });
return getFirstFromCursor(c);
}
/**
* Récupérer un élément selon sa lettre.
*
* @param contentResolver
* @param code
* @return un élément
*/
public T getSingleByLetter(final ContentResolver contentResolver, final String letter) {
final Cursor c = getCursor(contentResolver, LigneTable.LETTRE + "= ?", new String[] { letter });
return getFirstFromCursor(c);
}
/**
* Transformer un curseur en liste d'éléments
*
* @param c
* un Curseur
* @return une liste d'éléments
*/
protected List<T> getFromCursor(final Cursor c) {
final List<T> items = new ArrayList<T>();
if (c.getCount() > 0) {
onIndexCursor(c);
c.moveToFirst();
while (!c.isAfterLast()) {
items.add(getSingleFromCursor(c));
c.moveToNext();
}
}
c.close();
return items;
}
/**
* Retourner le premier élément d'un curseur
*
* @param c
* le curseur
* @return le premier élément du curseur
*/
protected T getFirstFromCursor(final Cursor c) {
T result = null;
if (c.getCount() > 0) {
onIndexCursor(c);
c.moveToFirst();
result = getSingleFromCursor(c);
}
c.close();
return result;
}
/**
* Indexer la position des colonnes pour préparer le
* {@link #getSingleFromCursor(Cursor)}.
*
* @param c
* le curseur à indexer.
*/
public void onIndexCursor(final Cursor c) {
}
/**
* Transformer la position courante d'un curseur en élément.
*
* @param c
* le curseur
* @return un élément
*/
public abstract T getSingleFromCursor(Cursor c);
protected abstract ContentValues getContentValues(final T item);
}