SQLite Programmation Mobile Android Master CCI Bertrand Estellon Aix-Marseille Université March 23, 2015 Nous allons voir comment stocker de l information structurée sous la forme d une base de données SQLite Pour cela, nous allons : définir un modèle de données (les tables) ; représenter ce modèle sous la forme de classes ; définir un SQL Helper pour faciliter la création des tables ; voir comment modifier, consulter les données Bertrand Estellon (AMU) Android Master CCI March 23, 2015 1 / 266 Définition du modèle Définition du modèle de données, c est-à-dire, les tables : Bertrand Estellon (AMU) Android Master CCI March 23, 2015 203 / 266 Construction des instructions SQL à partir de la définition du modèle : public class DatabaseContract { public interface Articles extends BaseColumns { String tablename = "articles"; String columnguid = "guid"; String columnguidtype = "TEXT"; String columntitle = "title"; String columntitletype = "TEXT"; String columncontent = "content"; String columncontenttype = "TEXT"; Les autres types possibles : NULL, INTEGER, REAL et BLOB ; Il peut y avoir plusieurs tables private static final String SQLCreateTableArticles = "CREATE TABLE " + DatabaseContractArticlestableName + " (" + DatabaseContractArticles_ID + " INTEGER PRIMARY KEY," + DatabaseContractArticlescolumnGuid + " " + DatabaseContractArticlescolumnGuidType + ", " + DatabaseContractArticlescolumnTitle + " " + DatabaseContractArticlescolumnTitleType + ", " + DatabaseContractArticlescolumnContent + " " + DatabaseContractArticlescolumnContentType + " )"; private static final String SQLDeleteTableArticles = "DROP TABLE IF EXISTS " + DatabaseContractArticlestableName; Bertrand Estellon (AMU) Android Master CCI March 23, 2015 204 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 205 / 266
Création de la base de données : public static final int databaseversion = 1; public static final String databasename = "articlesdb"; public DatabaseOpenHelper(Context context) { super(context, databasename, null, databaseversion); public void oncreate(sqlitedatabase database) { databaseexecsql(sqlcreatetablearticles); Mise à jour de la base de données lors d un changement de version : public static final int databaseversion = 1; public void onupgrade(sqlitedatabase database, int oldversion, int newversion) { databaseexecsql(sqldeletetablearticles); oncreate(database); public void ondowngrade(sqlitedatabase database, int oldversion, int newversion) { onupgrade(database, oldversion, newversion); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 206 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 207 / 266 Avant d utiliser le SQLiteOpenHelper, il faut l instancier : databaseopenhelper = new DatabaseOpenHelper(context); Insertion (INSERT INTO) : public void insert(article article) { SQLiteDatabase database = databaseopenhelpergetwritabledatabase(); valuesput(databasecontractarticlescolumnguid, articleguid); valuesput(databasecontractarticlescolumncontent, articlecontent); valuesput(databasecontractarticlescolumntitle, articletitle); databaseinsert(databasecontractarticlestablename, null, values); Mise en jour (UPDATE) : public void update(article article) { SQLiteDatabase database = databaseopenhelpergetwritabledatabase(); valuesput(databasecontractarticlescolumncontent, articlecontent); valuesput(databasecontractarticlescolumntitle, articletitle); String selection = DatabaseContractArticlescolumnGuid + " =?"; String[] selectionargs = {articleguid; databaseupdate(databasecontractarticlestablename, values, selection, selectionargs); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 208 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 209 / 266
SELECT * FROM articles : Suppression DELETE : public void delete(string guid) { SQLiteDatabase database = databaseopenhelpergetwritabledatabase(); String selection = DatabaseContractArticlescolumnGuid + " =?"; String[] selectionargs = {guid; databasedelete(databasecontractarticlestablename, selection, selectionargs); public Cursor getarticles() { SQLiteDatabase database = databaseopenhelpergetreadabledatabase(); return databasequery(databasecontractarticlestablename, null, null, new String[]{, null, null, null); SELECT guild, title FROM articles WHERE title LIKE "%s%" : public Cursor getarticles(string s) { SQLiteDatabase database = databaseopenhelpergetreadabledatabase(); String selection = DatabaseContractArticlescolumnTitle + " LIKE?"; String[] selectionargs = {"%"+s+"%"; String[] columns = { DatabaseContractArticlescolumnGuid, DatabaseContractArticlescolumnTitle; return databasequery(databasecontractarticlestablename, columns, selection, selectionargs, null, null, null); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 210 / 266 Les curseurs Bertrand Estellon (AMU) Android Master CCI March 23, 2015 211 / 266 Exemple d application Les curseurs permettent de parcourir le résultat d une requête : int getcount(); boolean movetofirst(); boolean movetonext(); boolean movetoposition(int position); int getcolumnindex(string columnname); String getstring(int columnindex) double getdouble(int columnindex) void close(); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 212 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 213 / 266
Les tables En supposant que nous avons écrit le SQLiteOpenHelper : La structure de la base de données : public class DatabaseContract { public interface Items extends BaseColumns { String tablename = "items"; String columntext = "text"; String columntexttype = "TEXT"; private DatabaseOpenHelper databaseopenhelper; private ItemAdapter adapter; private EditText edittext; protected void oncreate(bundle savedinstancestate) { superoncreate(savedinstancestate); databaseopenhelper = new DatabaseOpenHelper(this); setcontentview(rlayoutactivity_main); recyclerview = (RecyclerView)findViewById(RidrecyclerView); recyclerviewsetlayoutmanager(new LinearLayoutManager(this)); adapter = new ItemAdapter(getItems()); recyclerviewsetadapter(adapter); edittext = (EditText)findViewById(RideditText); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 214 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 215 / 266 Les méthodes qui interagissent avec la base de données : private DatabaseOpenHelper databaseopenhelper; private Cursor getitems() { SQLiteDatabase database = databaseopenhelpergetreadabledatabase(); return databasequery(databasecontractitemstablename, null, null, new String[]{, null, null, null); private void insertitem(string text) { SQLiteDatabase database = databaseopenhelpergetwritabledatabase(); valuesput(databasecontractitemscolumntext, text); databaseinsert(databasecontractitemstablename, null, values); Traitement des clics sur le bouton Ajouter : private ItemAdapter adapter; private EditText edittext; public void onadditem(view view) { insertitem(edittextgettext()tostring()); adapterchangecursor(getitems()); edittextsettext(""); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 216 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 217 / 266
Création des vues : public class ItemAdapter extends RecyclerViewAdapter<ViewHolder> { public ItemAdapter(Cursor cursor) { thiscursor = cursor; public ViewHolder oncreateviewholder(viewgroup parent, int viewtype) { View view = LayoutInflaterfrom(parentgetContext()) inflate(rlayoutitem, parent, false); ViewHolder viewholder = new ViewHolder(view); return viewholder; Mise à jour des vues et nombre d éléments dans le curseur : public class ItemAdapter extends RecyclerViewAdapter<ViewHolder> { public void onbindviewholder(viewholder holder, int position) { cursormovetoposition(position); int index = cursorgetcolumnindex(databasecontractitemscolumntext); String text = cursorgetstring(index); holderbind(text); public int getitemcount() { return cursorgetcount(); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 218 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 219 / 266 Le code de ViewHolder Changement de curseur : public class ItemAdapter extends RecyclerViewAdapter<ViewHolder> { public void changecursor(cursor cursor) { thiscursorclose(); thiscursor = cursor; notifydatasetchanged(); public class ViewHolder extends RecyclerViewViewHolder { private final TextView textview; public ViewHolder(View itemview) { super(itemview); textview = (TextView)itemViewfindViewById(Ridtext); public void bind(string text) { textviewsettext(text); Bertrand Estellon (AMU) Android Master CCI March 23, 2015 220 / 266 Bertrand Estellon (AMU) Android Master CCI March 23, 2015 221 / 266