/** * 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.impl; import java.util.List; import net.naonedbus.bean.Arret; import net.naonedbus.bean.Favori; import net.naonedbus.manager.SQLiteManager; import net.naonedbus.provider.impl.ArretProvider; import net.naonedbus.provider.table.ArretTable; import net.naonedbus.provider.table.EquipementTable; import net.naonedbus.provider.table.FavoriTable; import net.naonedbus.provider.table.LigneTable; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.database.CursorWrapper; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class ArretManager extends SQLiteManager<Arret> { private static ArretManager sInstance; public static synchronized ArretManager getInstance() { if (sInstance == null) { sInstance = new ArretManager(); } return sInstance; } private final Arret.Builder mBuilder; private int mColId; private int mColCodeLigne; private int mColLettre; private int mColCodeSens; private int mColCodeArret; private int mColCodeEquipement; private int mColNormalizedNom; private int mColLatitude; private int mColLongitude; private int mColIdStation; private int mColOrdre; private int mColNomArret; private ArretManager() { super(ArretProvider.CONTENT_URI); mBuilder = new Arret.Builder(); } /*** * Récéruper les arrêt selon un nom. * * @param contentResolver * @param query * @return */ public Cursor findByName(final ContentResolver contentResolver, final String query) { return getCursor(contentResolver, EquipementTable.NORMALIZED_NOM + " LIKE %?%", new String[] { query }); } /** * Récupérer une liste contenant les arrets de la ligne et du sens sépcifiée * * @param contentResolver * @param codeLigne */ public List<Arret> getAll(final ContentResolver contentResolver, final String codeLigne, final String codeSens) { final Cursor c = getCursor(contentResolver, codeLigne, codeSens); return getFromCursor(c); } @Override public Arret getSingle(final ContentResolver contentResolver, final int id) { final Cursor c = getCursor(contentResolver, ArretTable.TABLE_NAME + "._id = ?", new String[] { String.valueOf(id) }); return getFirstFromCursor(c); } /** * Récupérer un arrêt selon son code ligne et sens et du nom de l'arrêt. * * @param contentResolver * @param codeLigne * le code de la ligne * @param codeSens * le code du sens * @param nomArret * le code de l'arrêt * @return L'arrêt cherche, ou {@code null} si non trouvé. */ public Arret getSingle(final ContentResolver contentResolver, final String codeLigne, final String codeSens, final String nomArret) { final Cursor c = getCursor(contentResolver, ArretTable.CODE_LIGNE + "=? AND " + ArretTable.CODE_SENS + "=? AND " + EquipementTable.NORMALIZED_NOM + "=?", new String[] { codeLigne, codeSens, nomArret }); return getFirstFromCursor(c); } /** * Récupérer les arrêts favoris selon son code ligne et sens. * * @param contentResolver * @param codeLigne * le code de la ligne * @param codeSens * le code du sens * @return La liste des arrêts favoris de la ligne et du sens donné */ public List<Arret> getArretsFavoris(final ContentResolver contentResolver, final String codeLigne, final String codeSens) { final Cursor c = getCursor(contentResolver, ArretTable.CODE_LIGNE + "=? AND " + ArretTable.CODE_SENS + "=? AND EXISTS (SELECT 1 FROM " + FavoriTable.TABLE_NAME + " WHERE " + FavoriTable.TABLE_NAME + "." + FavoriTable._ID + "=" + ArretTable.TABLE_NAME + "." + ArretTable._ID + ")", new String[] { codeLigne, codeSens }); return getFromCursor(c); } public Cursor getCursor(final ContentResolver contentResolver, final String codeLigne, final String codeSens) { final Uri.Builder builder = ArretProvider.CONTENT_URI.buildUpon(); builder.path(ArretProvider.ARRET_CODESENS_CODELIGNE_URI_PATH_QUERY); builder.appendQueryParameter("codeLigne", codeLigne); builder.appendQueryParameter("codeSens", codeSens); return contentResolver.query(builder.build(), null, null, null, null); } @Override public void onIndexCursor(final Cursor c) { mColId = c.getColumnIndex(ArretTable._ID); mColCodeArret = c.getColumnIndex(ArretTable.CODE); mColLettre = c.getColumnIndex(LigneTable.LETTRE); mColCodeEquipement = c.getColumnIndex(EquipementTable.CODE); mColCodeLigne = c.getColumnIndex(ArretTable.CODE_LIGNE); mColCodeSens = c.getColumnIndex(ArretTable.CODE_SENS); mColNomArret = c.getColumnIndex(EquipementTable.NOM); mColNormalizedNom = c.getColumnIndex(EquipementTable.NORMALIZED_NOM); mColLatitude = c.getColumnIndex(EquipementTable.LATITUDE); mColLongitude = c.getColumnIndex(EquipementTable.LONGITUDE); mColIdStation = c.getColumnIndex(ArretTable.ID_STATION); mColOrdre = c.getColumnIndex(ArretTable.ORDRE); } @Override public Arret getSingleFromCursor(final Cursor c) { mBuilder.setId(c.getInt(mColId)); mBuilder.setCodeArret(c.getString(mColCodeArret)); mBuilder.setLettre(c.getString(mColLettre)); mBuilder.setCodeEquipement(c.getString(mColCodeEquipement)); mBuilder.setCodeLigne(c.getString(mColCodeLigne)); mBuilder.setCodeSens(c.getString(mColCodeSens)); mBuilder.setNomArret(c.getString(mColNomArret)); mBuilder.setNormalizedNom(c.getString(mColNormalizedNom)); mBuilder.setLatitude(c.getFloat(mColLatitude)); mBuilder.setLongitude(c.getFloat(mColLongitude)); mBuilder.setIdStation(c.getInt(mColIdStation)); mBuilder.setOrdre(c.getInt(mColOrdre)); return mBuilder.build(); } public Arret getSingleFromCursorWrapper(final CursorWrapper c) { mBuilder.setId(c.getInt(c.getColumnIndex(ArretTable._ID))); mBuilder.setCodeArret(c.getString(c.getColumnIndex(ArretTable.CODE))); mBuilder.setLettre(c.getString(c.getColumnIndex(LigneTable.LETTRE))); mBuilder.setCodeEquipement(c.getString(c.getColumnIndex(EquipementTable.CODE))); mBuilder.setCodeLigne(c.getString(c.getColumnIndex(ArretTable.CODE_LIGNE))); mBuilder.setCodeSens(c.getString(c.getColumnIndex(ArretTable.CODE_SENS))); mBuilder.setNomArret(c.getString(c.getColumnIndex(EquipementTable.NOM))); mBuilder.setLatitude(c.getFloat(c.getColumnIndex(EquipementTable.LATITUDE))); mBuilder.setLongitude(c.getFloat(c.getColumnIndex(EquipementTable.LONGITUDE))); mBuilder.setIdStation(c.getInt(c.getColumnIndex(ArretTable.ID_STATION))); mBuilder.setOrdre(c.getInt(c.getColumnIndex(ArretTable.ORDRE))); return mBuilder.build(); } public Integer getIdByFavori(final ContentResolver contentResolver, final Favori favori) { Integer id = null; final Uri.Builder builder = ArretProvider.CONTENT_URI.buildUpon(); builder.path(ArretProvider.ARRET_CODEARRET_CODESENS_CODELIGNE_URI_PATH_QUERY); builder.appendQueryParameter("codeArret", favori.getCodeArret()); builder.appendQueryParameter("codeSens", favori.getCodeSens()); builder.appendQueryParameter("codeLigne", favori.getCodeLigne()); final Cursor c = contentResolver.query(builder.build(), null, null, null, null); final Arret arretItem = getFirstFromCursor(c); if (arretItem != null) { id = arretItem.getId(); } return id; } public Integer getIdByFavori(final SQLiteDatabase db, final Favori favori) { Integer id = null; final Cursor c = db.query(ArretTable.TABLE_NAME, new String[] { ArretTable._ID }, ArretTable.CODE + "=? AND " + ArretTable.CODE_SENS + "=? AND " + ArretTable.CODE_LIGNE + "=?", new String[] { favori.getCodeArret(), favori.getCodeSens(), favori.getCodeLigne() }, null, null, null); if (c.getCount() > 0) { c.moveToFirst(); id = c.getInt(c.getColumnIndex(ArretTable._ID)); } c.close(); return id; } @Override public Arret getSingle(final ContentResolver contentResolver, final String code) { final Cursor c = getCursor(contentResolver, ArretTable.TABLE_NAME + ".code = ?", new String[] { code }); return getFirstFromCursor(c); } @Override public ContentValues getContentValues(final Arret item) { final ContentValues values = new ContentValues(); values.put(ArretTable._ID, item.getId()); values.put(ArretTable.CODE_LIGNE, item.getCodeLigne()); values.put(ArretTable.CODE_SENS, item.getCodeSens()); values.put(ArretTable.CODE, item.getCodeArret()); values.put(ArretTable.ID_STATION, item.getIdStation()); values.put(ArretTable.ORDRE, item.getOrdre()); values.put(EquipementTable.NOM, item.getNomArret()); values.put(EquipementTable.NORMALIZED_NOM, item.getNormalizedNom()); return values; } }