Après avoir réalisé notre tout premier programme avec Google Android, nous allons nous lancer dans la réalisation d’un projet un peu plus complexe : un lecteur de flux RSS.
Ce sommaire lecteur de flux permettra juste de s’abonner, se désabonner et d’afficher des flux RSS. Vous pouvez récupérer l’archive incluant sources et binaires si vous souhaitez tester tout de suite le programme.
Présentation de SQLite
La plate-forme Android intègre le système de base de données relationnelle embarquée SQLite. SQLite est un mini SGBD ne nécessitant que peu de ressources, qui offre la possiblité de gérer facilement des bases de données de taille restreinte.
Comme son nom l’indique, SQLite s’utilise par le biais de requêtes SQL. Il est très bien intégré à Android, ce dernier propose un grand nombre de routines qui nous permettront d’interagir très simplement avec les données (par exemple, pour les afficher à l’écran). Nous l’utiliserons dans notre programme pour gérer la liste des flux RSS auxquels l’on est abonné.
Shéma de la base de donnée
Nous utiliserons un shéma assez simple pour notre base de donnée. Elle ne se constituera que deux trois colonnes :
_id | url | visit |
---|
Le champ _id est un nombre entier qui représente l’identifiant de chaque lien, il sera la clef primaire de notre table. Attention son nom est une convention Android / SQLite, veillez toujours à avoir une clef primaire nommée ainsi dans vos tables. Dans le cas contraire vous ne pourrez pas utiliser simplement les curseurs plus tard ! Ce champ est complètement géré par SQLite. Il s’occupera de l’incrémenter automatiquement et de veiller à sa cohérence.
Le champ url de type text contiendra l’adresse du flux RSS.
Le champ visit, qui n’a aucune utilisé dans l’état actuel du programme, pourrait servir à compter le nombre de chargement des flux RSS afin de les classer par ordre d’assiduité par la suite.
La classe Database
Nous allons placer tout ce qui a trait à la base de données dans une classe nommée Database. Après avoir créer un nouveau projet dans Eclipse, créez donc cette classe. Nous utiliserons deux variables qui portent sur tout la classe :
private SQLiteDatabase db;
private RSSreader rss;
db permet d’agir sur la base de donnée tandis que rss représente le contexte, notre classe principale (nommée RSSreader). La variable rss nous permet d’utiliser les fonctions openDatabase et createDatabase fournies par la plate-forme.
Le constructeur ce contente d’instancier la variable rss et de lancer la procédure d’ouverture de la base de données.
public Database (RSSreader rss) {
this.rss = rss;
open ();
}
Cette procédure appelle la méthode fournie par Android openDatabase qui nous permettra d’interagir avec la base de donnée depuis la variable db. Si la base de données n’existe pas, on appelle la procédure qui la créera.
private void open () {
try {
db = rss.openDatabase ("rssreader", null);
}
catch (FileNotFoundException e) {
// Create the database
createDb ();
open ();
}
}
La procédure de création de la base de donnée :
private void createDb () {
String sql;
/* Command to view the DB : sqlite3 data/data/net.lapinblanc.android.rssreader/databases/rssreader */
try {
// Create the database
db = rss.createDatabase ("rssreader", 1, rss.MODE_PRIVATE, null);
sql = "CREATE TABLE IF NOT EXISTS feed(_id INTEGER PRIMARY KEY, url TEXT, visit INTEGER);";
db.execSQL (sql);
// Insert un example
add ("//dunglas.fr/feed/");
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
La base de donnée est ici privée (MODE_PRIVATE), c’est à dire que seul notre programme pourra y accèder. La création en elle-même revient à envoyer une requête SQL classique de création de table. Nous créons donc notre base de donnée nommée rssreader puis nous insérons un flux d’exemple (celui de ce blog) en appelant la procédure add.
La base de donnée correspond en fait à un fichier texte rangé dans le répertoire /data/data/votre.package/databases/. Pour vous y connecter lancez la commande adb shell dans un terminal. Vous voici avec un shell au sein du système Android (celui de l’émulateur dans notre cas). Il s’agit en fait de BusyBox tournant au-dessus d’un noyau Linux. Pour utilisez la base de donnée en mode shell lancez sqlite3 /data/data/net.lapinblanc.android.rssreader/databases/rssreader. N’oubliez pas les points virgules terminaux à vos requêtes vous les exécuter !
La procédure add prend en paramètre une url et l’ajoute à la base de donnée :
public void add (String url) {
/* Insert feed into the database */
SQLiteStatement st = db.compileStatement("INSERT INTO feed(url, visit) VALUES ('?, 0)");
st.bindString(1, url);
st.execute();
}
Ici aussi, le code est limpide, il s’agit de simples requêtes SQL comme si l’on agissait sur serveur de base de données classique.
Voyons maintenant comment supprimer un flux de la base de donnée :
public void delete (String url) {
db.execSQL("DELETE FROM feed WHERE url='" + url + "';");
SQLiteStatement st = db.compileStatement("DELETE FROM feed WHERE url='?';"));
st.bindString(1, url);
st.execute();
}
Dernière méthode, certainement la plus intéressante, celle qui renvoi la liste des flux dans la base de données :
public Cursor list () {
/* Return a Cursor on a list of stored RSS feeds */
String [] selectionArgs = {};
String [] columns = {"_id", "url", "visit"};
return db.query (true, "feed", columns, null, selectionArgs, null, null, null);
}
Elle retourne un curseur, c’est ce curseur qui nous permettra plus tard de placer les flux dans une liste déroulante. Le tableau de chaines de caractères selectionArgs, ici vide, permet de spécifier des critères de sélection, formatés à la manière d’une clause WHERE dans une requête SQL. Le tableau columns permet d’indiquer quels colonnes nous souhaitons sélectionner, à la manière d’un SELECT en SQL. N’oubliez de sélectionner la colonne _id quelque soit votre requête. Sans elle l’utilisation ultérieur des curseurs sera beaucoup plus difficile.
Nous avons maintenant une base de donnée fonctionnelle et très légère sous Android. Dans le prochain article nous verrons comment créer une interface graphique pour gérer ces données.
Note : Merci à Infernal Quark d’avoir corrigé l’affreuse faille par injection SQL que j’avais laissé trainé…
This certainly very good website you have going here. The situation is quite helpful along with straight to the stage. Ecstatic to read more about your site the next occasion.