/* * Copyright 2014, 2015, 2016 Anael Mobilia * * This file is part of NextINpact-Unofficial. * * NextINpact-Unofficial 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. * * NextINpact-Unofficial 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 NextINpact-Unofficial. If not, see <http://www.gnu.org/licenses/> */ package com.pcinpact.datastorage; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.pcinpact.items.ArticleItem; import com.pcinpact.items.CommentaireItem; import com.pcinpact.utils.Constantes; import com.pcinpact.utils.Tools; import java.util.ArrayList; import java.util.HashMap; /** * Abstraction de la BDD sqlite. * * @author Anael */ public final class DAO extends SQLiteOpenHelper { /** * Version de la BDD (à mettre à jour à chaque changement du schèma). */ private static final int BDD_VERSION = 6; /** * Nom de la BDD. */ private static final String BDD_NOM = "nxidb"; /** * Table articles. */ private static final String BDD_TABLE_ARTICLES = "articles"; /** * Champ articles => ID. */ private static final String ARTICLE_ID = "id"; /** * Champ articles => Titre . */ private static final String ARTICLE_TITRE = "titre"; /** * Champ articles => Sous Titre . */ private static final String ARTICLE_SOUS_TITRE = "soustitre"; /** * Champ articles => Timestamp Publication. */ private static final String ARTICLE_TIMESTAMP = "timestamp"; /** * Champ articles => URL . */ private static final String ARTICLE_URL = "url"; /** * Champ articles => URL miniature . */ private static final String ARTICLE_ILLUSTRATION_URL = "miniatureurl"; /** * Champ articles => Contenu . */ private static final String ARTICLE_CONTENU = "contenu"; /** * Champ articles => Nb de commentaires . */ private static final String ARTICLE_NB_COMMS = "nbcomms"; /** * Champ articles => abonné ? */ private static final String ARTICLE_IS_ABONNE = "isabonne"; /** * Champ articles => Lu ? */ private static final String ARTICLE_IS_LU = "islu"; /** * Champ articles => Contenu abonnétéléchargé ? */ private static final String ARTICLE_DL_CONTENU_ABONNE = "iscontenuabonnedl"; /** * Champ articles => dernier commentaire lu */ private static final String ARTICLE_DERNIER_COMMENTAIRE_LU = "dernierCommentaireLu"; /** * Table commentaires. */ private static final String BDD_TABLE_COMMENTAIRES = "commentaires"; /** * Table commentaires temporaire (#205 - changement de primary key). */ private static final String BDD_TABLE_COMMENTAIRES_TMP = "commentaires2"; /** * Champ commentaires => ID. */ private static final String COMMENTAIRE_ID = "id"; /** * Champ commentaires => ID article. */ private static final String COMMENTAIRE_ID_ARTICLE = "idarticle"; /** * Champ commentaires => UUID du commentaire. */ private static final String COMMENTAIRE_UUID = "uuid"; /** * Champ commentaires => Auteur. */ private static final String COMMENTAIRE_AUTEUR = "auteur"; /** * Champ commentaires => Timestamp Publication. */ private static final String COMMENTAIRE_TIMESTAMP = "timestamp"; /** * Champ commentaires => Contenu. */ private static final String COMMENTAIRE_CONTENU = "contenu"; /** * Table refresh. */ private static final String BDD_TABLE_REFRESH = "refresh"; /** * Champ refresh => ID article. */ private static final String REFRESH_ARTICLE_ID = "id"; /** * Champ refresh => Timestamp Refresh. */ private static final String REFRESH_TIMESTAMP = "timestamp"; /** * Table cacheImage. */ private static final String BDD_TABLE_CACHE_IMAGE = "cacheImage"; /** * Champ cacheImage => md5 de l'URL de l'image */ private static final String CACHE_IMAGE_MD5 = "md5"; /** * Champ cacheImage => ID de l'article */ private static final String CACHE_IMAGE_ID_ARTICLE = "idArticle"; /** * Champ cacheImage => Type d'image */ private static final String CACHE_IMAGE_TYPE_IMAGE = "typeImage"; /** * Champ cacheImage => URL de l'image */ private static final String CACHE_IMAGE_URL_IMAGE = "urlImage"; /** * BDD SQLite. */ private static SQLiteDatabase maBDD = null; /** * Instance de la BDD. */ private static DAO instanceOfDAO = null; /** * Connexion à la BDD. * * @param unContext context de l'application */ private DAO(final Context unContext) { // Je crée un lien sur la base super(unContext, BDD_NOM, null, BDD_VERSION); // Et l'ouvre en écriture maBDD = getWritableDatabase(); } /** * Fournit l'instance de la BDD. * * @param unContext contex de l'application * @return lien sur la BDD */ public static DAO getInstance(final Context unContext) { /** * Chargement de la BDD si non déjà présente */ if (instanceOfDAO == null) { instanceOfDAO = new DAO(unContext.getApplicationContext()); } return instanceOfDAO; } /** * Création de la BDD si elle n'existe pas. */ @Override public void onCreate(SQLiteDatabase db) { // Table des articles String reqCreateArticles = "CREATE TABLE " + BDD_TABLE_ARTICLES + " (" + ARTICLE_ID + " INTEGER PRIMARY KEY, " + ARTICLE_TITRE + " TEXT NOT NULL, " + ARTICLE_SOUS_TITRE + " TEXT, " + ARTICLE_TIMESTAMP + " INTEGER NOT NULL, " + ARTICLE_URL + " TEXT NOT NULL, " + ARTICLE_ILLUSTRATION_URL + " TEXT, " + ARTICLE_CONTENU + " TEXT, " + ARTICLE_NB_COMMS + " INTEGER, " + ARTICLE_IS_ABONNE + " BOOLEAN, " + ARTICLE_IS_LU + " BOOLEAN, " + ARTICLE_DL_CONTENU_ABONNE + " BOOLEAN, " + ARTICLE_DERNIER_COMMENTAIRE_LU + " INTEGER);"; db.execSQL(reqCreateArticles); // Table des commentaires String reqCreateCommentaires = "CREATE TABLE " + BDD_TABLE_COMMENTAIRES + " (" + COMMENTAIRE_ID + " INTEGER NOT NULL, " + COMMENTAIRE_ID_ARTICLE + " INTEGER NOT NULL REFERENCES " + BDD_TABLE_ARTICLES + "(" + ARTICLE_ID + "), " + COMMENTAIRE_UUID + " INTEGER NOT NULL, " + COMMENTAIRE_AUTEUR + " TEXT, " + COMMENTAIRE_TIMESTAMP + " INTEGER, " + COMMENTAIRE_CONTENU + " TEXT, PRIMARY KEY (" + COMMENTAIRE_ID_ARTICLE + ", " + COMMENTAIRE_UUID + "));"; db.execSQL(reqCreateCommentaires); // Table des refresh String reqCreateRefresh = "CREATE TABLE " + BDD_TABLE_REFRESH + " (" + REFRESH_ARTICLE_ID + " INTEGER PRIMARY KEY, " + REFRESH_TIMESTAMP + " INTEGER);"; db.execSQL(reqCreateRefresh); // Table du cache des images String reqCreateCacheImage = "CREATE TABLE " + BDD_TABLE_CACHE_IMAGE + " (" + CACHE_IMAGE_ID_ARTICLE + " INTEGER, " + CACHE_IMAGE_MD5 + " INTEGER, " + CACHE_IMAGE_TYPE_IMAGE + " INTEGER, " + CACHE_IMAGE_URL_IMAGE + " INTEGER);"; db.execSQL(reqCreateCacheImage); } /** * MàJ du schéma de la BDD si le BDD_VERSION ne correspond pas. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: String reqUpdateFrom1 = "ALTER TABLE " + BDD_TABLE_ARTICLES + " ADD COLUMN " + ARTICLE_IS_LU + " BOOLEAN;"; db.execSQL(reqUpdateFrom1); case 2: String reqUpdateFrom2 = "ALTER TABLE " + BDD_TABLE_ARTICLES + " ADD COLUMN " + ARTICLE_DL_CONTENU_ABONNE + " BOOLEAN;"; db.execSQL(reqUpdateFrom2); case 3: String reqUpdateFrom3 = "CREATE TABLE " + BDD_TABLE_CACHE_IMAGE + " (" + CACHE_IMAGE_ID_ARTICLE + " INTEGER, " + CACHE_IMAGE_MD5 + " INTEGER, " + CACHE_IMAGE_TYPE_IMAGE + " INTEGER, " + CACHE_IMAGE_URL_IMAGE + " INTEGER);"; db.execSQL(reqUpdateFrom3); case 4: String reqUpdateFrom4 = "ALTER TABLE " + BDD_TABLE_ARTICLES + " ADD COLUMN " + ARTICLE_DERNIER_COMMENTAIRE_LU + " INTEGER;"; db.execSQL(reqUpdateFrom4); case 5: // Création de la nouvelle table String reqUpdateFrom5 = "CREATE TABLE " + BDD_TABLE_COMMENTAIRES_TMP + " (" + COMMENTAIRE_ID + " INTEGER NOT NULL, " + COMMENTAIRE_ID_ARTICLE + " INTEGER NOT NULL REFERENCES " + BDD_TABLE_ARTICLES + "(" + ARTICLE_ID + "), " + COMMENTAIRE_UUID + " INTEGER NOT NULL, " + COMMENTAIRE_AUTEUR + " TEXT, " + COMMENTAIRE_TIMESTAMP + " INTEGER, " + COMMENTAIRE_CONTENU + " TEXT, PRIMARY KEY (" + COMMENTAIRE_ID_ARTICLE + ", " + COMMENTAIRE_UUID + "));"; db.execSQL(reqUpdateFrom5); // Import des données reqUpdateFrom5 = "INSERT INTO " + BDD_TABLE_COMMENTAIRES_TMP + " (" + COMMENTAIRE_ID + ", " + COMMENTAIRE_ID_ARTICLE + ", " + COMMENTAIRE_UUID + ", " + COMMENTAIRE_AUTEUR + ", " + COMMENTAIRE_TIMESTAMP + ", " + COMMENTAIRE_CONTENU + ") " + "SELECT " + COMMENTAIRE_ID + ", " + COMMENTAIRE_ID_ARTICLE + ", " + COMMENTAIRE_ID + ", " + COMMENTAIRE_AUTEUR + ", " + COMMENTAIRE_TIMESTAMP + ", " + COMMENTAIRE_CONTENU + " FROM " + BDD_TABLE_COMMENTAIRES + ";"; db.execSQL(reqUpdateFrom5); // Suppression ancienne table reqUpdateFrom5 = "DROP TABLE " + BDD_TABLE_COMMENTAIRES + ";"; db.execSQL(reqUpdateFrom5); // Renommage table temporaire reqUpdateFrom5 = "ALTER TABLE " + BDD_TABLE_COMMENTAIRES_TMP + " RENAME TO " + BDD_TABLE_COMMENTAIRES + ";"; db.execSQL(reqUpdateFrom5); // A mettre avant le default ! break; default: // DEBUG if (Constantes.DEBUG) { Log.e("DAO", "onUpgrade() - cas default !"); } } } /** * Enregistre (ou MàJ) un article en BDD. * * @param unArticle ArticleItem */ public void enregistrerArticle(final ArticleItem unArticle) { supprimerArticle(unArticle); ContentValues insertValues = new ContentValues(); insertValues.put(ARTICLE_ID, unArticle.getId()); insertValues.put(ARTICLE_TITRE, unArticle.getTitre()); insertValues.put(ARTICLE_SOUS_TITRE, unArticle.getSousTitre()); insertValues.put(ARTICLE_TIMESTAMP, unArticle.getTimeStampPublication()); insertValues.put(ARTICLE_URL, unArticle.getUrl()); insertValues.put(ARTICLE_ILLUSTRATION_URL, unArticle.getUrlIllustration()); insertValues.put(ARTICLE_CONTENU, unArticle.getContenu()); insertValues.put(ARTICLE_NB_COMMS, unArticle.getNbCommentaires()); insertValues.put(ARTICLE_IS_ABONNE, unArticle.isAbonne()); insertValues.put(ARTICLE_IS_LU, unArticle.isLu()); insertValues.put(ARTICLE_DL_CONTENU_ABONNE, unArticle.isDlContenuAbonne()); insertValues.put(ARTICLE_DERNIER_COMMENTAIRE_LU, unArticle.getDernierCommLu()); maBDD.insert(BDD_TABLE_ARTICLES, null, insertValues); } /** * Enregistre un article en BDD uniquement s'il n'existe pas déjà. * * @param unArticle ArticleItem * @return true si l'article n'était pas connu */ public boolean enregistrerArticleSiNouveau(final ArticleItem unArticle) { // J'essaye de charger l'article depuis la DB ArticleItem testItem = this.chargerArticle(unArticle.getId()); // Vérif du timestamp couvrant les cas : // - l'article n'est pas encore en BDD // - l'article est déjà en BDD, mais il s'agit d'une MàJ de l'article // - l'article est déjà en BDD, mais ne contient rien (pb de dl) if (testItem.getTimeStampPublication() != unArticle.getTimeStampPublication() || testItem.getContenu().equals("")) { this.enregistrerArticle(unArticle); return true; } else { // Je met à jour le nb de comms de l'article en question... updateNbCommentairesArticle(unArticle.getId(), unArticle.getNbCommentaires()); return false; } } /** * MàJ de l'ID du dernier commentaire lu * * @param articleID ID de l'article * @param idCommentaire ID du dernier commentaire lu */ public void setDernierCommentaireLu(final int articleID, final int idCommentaire) { // Les datas à MàJ ContentValues updateValues = new ContentValues(); updateValues.put(ARTICLE_DERNIER_COMMENTAIRE_LU, idCommentaire); maBDD.update(BDD_TABLE_ARTICLES, updateValues, ARTICLE_ID + "=?", new String[]{ String.valueOf(articleID) }); } /** * Récupération de l'ID du dernier commentaire lu * * @param articleID ID de l'article * @return int ID du dernier commentaire lu */ public int getDernierCommentaireLu(final int articleID) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ ARTICLE_DERNIER_COMMENTAIRE_LU }; String[] idString = { String.valueOf(articleID) }; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_ARTICLES, mesColonnes, ARTICLE_ID + "=?", idString, null, null, null); int retour = 0; // Je vais au premier (et unique) résultat if (monCursor.moveToNext()) { retour = monCursor.getInt(0); } // Fermeture du curseur monCursor.close(); // Valeur par défaut... if (retour < 1) { retour = 0; } return retour; } /** * MàJ du nb de commentaires d'un article déjà synchronisé. * * @param articleID ID de l'article * @param nbCommentaires Nb de commentaires */ public void updateNbCommentairesArticle(final int articleID, final int nbCommentaires) { // Les datas à MàJ ContentValues updateValues = new ContentValues(); updateValues.put(ARTICLE_NB_COMMS, nbCommentaires); maBDD.update(BDD_TABLE_ARTICLES, updateValues, ARTICLE_ID + "=?", new String[]{ String.valueOf(articleID) }); } /** * Marque un article comme étant lu * @param articleID ID de l'article */ public void marquerArticleLu(final int articleID) { // Les datas à MàJ ContentValues updateValues = new ContentValues(); updateValues.put(ARTICLE_IS_LU, true); maBDD.update(BDD_TABLE_ARTICLES, updateValues, ARTICLE_ID + "=?", new String[]{ String.valueOf(articleID) }); } /** * Supprime un article de la BDD.. * * @param unArticle ArticleItem */ public void supprimerArticle(final ArticleItem unArticle) { maBDD.delete(BDD_TABLE_ARTICLES, ARTICLE_ID + "=?", new String[]{ String.valueOf(unArticle.getId()) }); } /** * Charger un article depuis la BDD. * * @param idArticle id de l'article * @return ArticleItem de l'article */ public ArticleItem chargerArticle(final int idArticle) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ ARTICLE_ID, ARTICLE_TITRE, ARTICLE_SOUS_TITRE, ARTICLE_TIMESTAMP, ARTICLE_URL, ARTICLE_ILLUSTRATION_URL, ARTICLE_CONTENU, ARTICLE_NB_COMMS, ARTICLE_IS_ABONNE, ARTICLE_IS_LU, ARTICLE_DL_CONTENU_ABONNE, ARTICLE_DERNIER_COMMENTAIRE_LU }; String[] idString = { String.valueOf(idArticle) }; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_ARTICLES, mesColonnes, ARTICLE_ID + "=?", idString, null, null, null); ArticleItem monArticle = new ArticleItem(); // Je vais au premier (et unique) résultat if (monCursor.moveToNext()) { // Je charge les données de l'objet monArticle = cursorToArticleItem(monCursor); } // Fermeture du curseur monCursor.close(); return monArticle; } /** * Charge les n derniers articles de la BDD. * * @param nbVoulu nombre d'articles voulus (0 = pas de limite) * @return ArrayList<ArticleItem> les articles demandés */ public ArrayList<ArticleItem> chargerArticlesTriParDate(final int nbVoulu) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ ARTICLE_ID, ARTICLE_TITRE, ARTICLE_SOUS_TITRE, ARTICLE_TIMESTAMP, ARTICLE_URL, ARTICLE_ILLUSTRATION_URL, ARTICLE_CONTENU, ARTICLE_NB_COMMS, ARTICLE_IS_ABONNE, ARTICLE_IS_LU, ARTICLE_DL_CONTENU_ABONNE, ARTICLE_DERNIER_COMMENTAIRE_LU }; Cursor monCursor; // Une limite est-elle fournie ? if (nbVoulu == 0) { // Requête sur la BDD monCursor = maBDD.query(BDD_TABLE_ARTICLES, mesColonnes, null, null, null, null, "4 DESC", null); } else { // Requête sur la BDD monCursor = maBDD.query(BDD_TABLE_ARTICLES, mesColonnes, null, null, null, null, "4 DESC", String.valueOf(nbVoulu)); } ArrayList<ArticleItem> mesArticles = new ArrayList<>(); ArticleItem monArticle; // Je passe tous les résultats while (monCursor.moveToNext()) { // Je charge les données de l'objet monArticle = cursorToArticleItem(monCursor); // Et l'enregistre mesArticles.add(monArticle); } // Fermeture du curseur monCursor.close(); return mesArticles; } /** * Liste des articles sans contenu. * * @return ArrayList<ArticleItem> liste d'articleItem */ public ArrayList<ArticleItem> chargerArticlesATelecharger() { // Les colonnes à récupérer String[] mesColonnes = new String[]{ ARTICLE_ID, ARTICLE_TITRE, ARTICLE_SOUS_TITRE, ARTICLE_TIMESTAMP, ARTICLE_URL, ARTICLE_ILLUSTRATION_URL, ARTICLE_CONTENU, ARTICLE_NB_COMMS, ARTICLE_IS_ABONNE, ARTICLE_IS_LU, ARTICLE_DL_CONTENU_ABONNE, ARTICLE_DERNIER_COMMENTAIRE_LU }; // Articles vides et des articles abonnés non DL String[] contenu = new String[]{ "", "1", "0" }; String where = ARTICLE_CONTENU + "=? OR (" + ARTICLE_IS_ABONNE + "=? AND " + ARTICLE_DL_CONTENU_ABONNE + "=?)"; Cursor monCursor = maBDD.query(true, BDD_TABLE_ARTICLES, mesColonnes, where, contenu, null, null, null, null); ArrayList<ArticleItem> mesArticles = new ArrayList<>(); ArticleItem monArticle; // Je passe tous les résultats while (monCursor.moveToNext()) { // Je charge les données de l'objet monArticle = cursorToArticleItem(monCursor); // Et l'enregistre mesArticles.add(monArticle); } // Fermeture du curseur monCursor.close(); return mesArticles; } /** * Enregistre (ou MàJ) un commentaire en BDD. * * @param unCommentaire CommentaireItem */ private void enregistrerCommentaire(final CommentaireItem unCommentaire) { supprimerCommentaire(unCommentaire); ContentValues insertValues = new ContentValues(); insertValues.put(COMMENTAIRE_ID_ARTICLE, unCommentaire.getArticleId()); insertValues.put(COMMENTAIRE_UUID, unCommentaire.getUuid()); insertValues.put(COMMENTAIRE_ID, unCommentaire.getId()); insertValues.put(COMMENTAIRE_AUTEUR, unCommentaire.getAuteur()); insertValues.put(COMMENTAIRE_TIMESTAMP, unCommentaire.getTimeStampPublication()); insertValues.put(COMMENTAIRE_CONTENU, unCommentaire.getCommentaire()); maBDD.insert(BDD_TABLE_COMMENTAIRES, null, insertValues); } /** * Enregistre un commentaire en BDD uniquement s'il n'existe pas déjà. * * @param unCommentaire CommentaireItem * @return true si nouveau commentaire */ public boolean enregistrerCommentaireSiNouveau(final CommentaireItem unCommentaire) { // J'essaye de charger le commentaire depuis la BDD CommentaireItem testItem = this.chargerCommentaire(unCommentaire.getArticleId(), unCommentaire.getUuid()); // Vérif que le commentaire n'existe pas déjà if (!testItem.getIDArticleUuidCommentaire().equals(unCommentaire.getIDArticleUuidCommentaire())) { this.enregistrerCommentaire(unCommentaire); return true; } return false; } /** * Supprime un commentaire de la BDD (par ID du commentaire). * * @param unCommentaire CommentaireItem */ private void supprimerCommentaire(final CommentaireItem unCommentaire) { String[] mesParams = { String.valueOf(unCommentaire.getArticleId()), String.valueOf(unCommentaire.getUuid()) }; maBDD.delete(BDD_TABLE_COMMENTAIRES, COMMENTAIRE_ID_ARTICLE + "=? AND " + COMMENTAIRE_UUID + "=?", mesParams); } /** * Supprime des commentaires de la BDD (par ID de l'article). * * @param articleID ID de l'article */ public void supprimerCommentaire(final int articleID) { String[] mesParams = { String.valueOf(articleID) }; maBDD.delete(BDD_TABLE_COMMENTAIRES, COMMENTAIRE_ID_ARTICLE + "=?", mesParams); } /** * Charge un commentaire depuis la BDD. * * @param idArticle ID de l'article * @param uuidCommentaire UUID du commentaire * @return le commentaire */ private CommentaireItem chargerCommentaire(final int idArticle, final int uuidCommentaire) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ COMMENTAIRE_ID_ARTICLE, COMMENTAIRE_UUID, COMMENTAIRE_ID, COMMENTAIRE_AUTEUR, COMMENTAIRE_TIMESTAMP, COMMENTAIRE_CONTENU }; String[] idArticleEtCommentaire = { String.valueOf(idArticle), String.valueOf(uuidCommentaire) }; String where = COMMENTAIRE_ID_ARTICLE + "=? AND " + COMMENTAIRE_UUID + "=?"; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_COMMENTAIRES, mesColonnes, where, idArticleEtCommentaire, null, null, null); CommentaireItem monCommentaire = new CommentaireItem(); // Je vais au premier (et unique) résultat if (monCursor.moveToNext()) { // Je charge les données de l'objet monCommentaire = cursorToCommentaireItem(monCursor); } // Fermeture du curseur monCursor.close(); return monCommentaire; } /** * Charge tous les commentaires d'un article. * * @param articleID ID de l'article concerné * @return liste des commentaires */ public ArrayList<CommentaireItem> chargerCommentairesTriParDate(final int articleID) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ COMMENTAIRE_ID_ARTICLE, COMMENTAIRE_UUID, COMMENTAIRE_ID, COMMENTAIRE_AUTEUR, COMMENTAIRE_TIMESTAMP, COMMENTAIRE_CONTENU }; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_COMMENTAIRES, mesColonnes, COMMENTAIRE_ID_ARTICLE + "=?", new String[]{ String.valueOf(articleID) }, null, null, "2"); ArrayList<CommentaireItem> mesCommentaires = new ArrayList<>(); CommentaireItem monCommentaire; // Je passe tous les résultats while (monCursor.moveToNext()) { // Je charge les données de l'objet monCommentaire = cursorToCommentaireItem(monCursor); // Et l'enregistre mesCommentaires.add(monCommentaire); } // Fermeture du curseur monCursor.close(); return mesCommentaires; } /** * Fournit la date de dernière MàJ. * * @param idArticle ID de l'article * @return timestamp */ public long chargerDateRefresh(final int idArticle) { // Les colonnes à récupérer String[] mesColonnes = new String[]{ REFRESH_TIMESTAMP }; String[] idString = { String.valueOf(idArticle) }; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_REFRESH, mesColonnes, REFRESH_ARTICLE_ID + "=?", idString, null, null, null); long retour = 0; // Je vais au premier (et unique) résultat if (monCursor.moveToNext()) { retour = monCursor.getLong(0); } // Fermeture du curseur monCursor.close(); return retour; } /** * Définit la date de dernière MàJ. * * @param idArticle ID de l'article * @param dateRefresh date de MàJ */ public void enregistrerDateRefresh(final int idArticle, final long dateRefresh) { supprimerDateRefresh(idArticle); ContentValues insertValues = new ContentValues(); insertValues.put(REFRESH_ARTICLE_ID, idArticle); insertValues.put(REFRESH_TIMESTAMP, dateRefresh); maBDD.insert(BDD_TABLE_REFRESH, null, insertValues); } /** * Supprime la date de derniàre MàJ. * * @param idArticle ID de l'article */ public void supprimerDateRefresh(final int idArticle) { maBDD.delete(BDD_TABLE_REFRESH, REFRESH_ARTICLE_ID + "=?", new String[]{ String.valueOf(idArticle) }); } /** * Charge un ArticleItem depuis un cursor. * * @param unCursor tel retourné par une rquête * @return un ArticleItem */ private ArticleItem cursorToArticleItem(final Cursor unCursor) { ArticleItem monArticle = new ArticleItem(); monArticle.setId(unCursor.getInt(0)); monArticle.setTitre(unCursor.getString(1)); monArticle.setSousTitre(unCursor.getString(2)); monArticle.setTimeStampPublication(unCursor.getLong(3)); monArticle.setUrl(unCursor.getString(4)); monArticle.setUrlIllustration(unCursor.getString(5)); monArticle.setContenu(unCursor.getString(6)); monArticle.setNbCommentaires(unCursor.getInt(7)); monArticle.setAbonne((unCursor.getInt(8) > 0)); monArticle.setLu((unCursor.getInt(9) > 0)); monArticle.setDlContenuAbonne((unCursor.getInt(10) > 0)); monArticle.setDernierCommLu(unCursor.getInt(11)); return monArticle; } /** * Charge un CommentaireItem depuis un cursor. * * @param unCursor tel retourné par une requête * @return un CommentaireItem */ private CommentaireItem cursorToCommentaireItem(final Cursor unCursor) { CommentaireItem monCommentaire = new CommentaireItem(); monCommentaire.setArticleId(unCursor.getInt(0)); monCommentaire.setUuid(unCursor.getInt(1)); monCommentaire.setId(unCursor.getInt(2)); monCommentaire.setAuteur(unCursor.getString(3)); monCommentaire.setTimeStampPublication(unCursor.getLong(4)); monCommentaire.setCommentaire(unCursor.getString(5)); return monCommentaire; } /** * Suppression de tout le contenu de la BDD. */ public void vider() { // Les articles maBDD.delete(BDD_TABLE_ARTICLES, null, null); // Les commentaires maBDD.delete(BDD_TABLE_COMMENTAIRES, null, null); // Date de refresh maBDD.delete(BDD_TABLE_REFRESH, null, null); // Cache maBDD.delete(BDD_TABLE_CACHE_IMAGE, null, null); } /** * Cache - enregistrement d'une image. * * @param idArticle ID de l'article * @param UrlImage URL de l'image * @param typeImage Type d'image (cf Constantes) */ public void cacheEnregistrerImage(final int idArticle, final String UrlImage, final int typeImage) { ContentValues insertValues = new ContentValues(); insertValues.put(CACHE_IMAGE_ID_ARTICLE, idArticle); insertValues.put(CACHE_IMAGE_MD5, Tools.md5(UrlImage)); insertValues.put(CACHE_IMAGE_TYPE_IMAGE, typeImage); insertValues.put(CACHE_IMAGE_URL_IMAGE, UrlImage); maBDD.insert(BDD_TABLE_CACHE_IMAGE, null, insertValues); } /** * Cache - suppression des images d'un article. * * @param idArticle ID de l'article concerné */ public void cacheSupprimer(final int idArticle) { maBDD.delete(BDD_TABLE_CACHE_IMAGE, CACHE_IMAGE_ID_ARTICLE + "=?", new String[]{ String.valueOf(idArticle) }); } /** * Cache - liste toutes les images d'un type. * * @param typeImage type d'image souhaité * @return liste d'images <MD5, URL> */ public HashMap<String, String> cacheListeImages(final int typeImage) { // Retour HashMap<String, String> monRetour = new HashMap<>(); // Les colonnes à récupérer String[] mesColonnes = new String[]{ CACHE_IMAGE_MD5, CACHE_IMAGE_URL_IMAGE }; // Requête sur la BDD Cursor monCursor = maBDD.query(BDD_TABLE_CACHE_IMAGE, mesColonnes, CACHE_IMAGE_TYPE_IMAGE + "=?", new String[]{ String.valueOf(typeImage) }, null, null, null); // Je passe tous les résultats while (monCursor.moveToNext()) { // Je charge les données de l'objet String md5 = monCursor.getString(0); String url = monCursor.getString(1); // Et l'enregistre monRetour.put(md5, url); } // Fermeture du curseur monCursor.close(); return monRetour; } }