Programmation mobile I
420-V41-SF

Cours 17 - Les bases de données mobiles

Par Jimmy Gilbert

16 avril 2018

Introduction

Introduction

Me présenter

Votre nouveau prof : Jimmy Gilbert

 

  • Études

  • Expériences
  • Mes passions
    • Technologies, multimédia & informatique
    • Jeux vidéos, Boxe,
      Culture japonaise

 

Introduction

Vous présenter

Dans un MIO, écrivez-moi:

  • Vos études et /ou expériences préalables?

  • Quelle serait votre carrière de rêve

  • Vos passions?

Et vous? Quel est votre parcours de vie?

Introduction

Déroulement de la session

  • Il reste 5 semaines (de torture :P)

  • 2 cours théoriques

  • Le reste du temps est pour le TP3

  • Présentation et remise des TP3 le 14 mai

    • Les 3 profs seront présents

  • Même règles que Ben et François

  • Retard:

    • Durant la théorie = attente à la pause

    • (ou absence) Durant le TP3 est évalué
  • Ma règle principale: le respect entre nous!

Introduction

Déroulement du cours

  1. Introduction (en cours)

  2. Théorie sur SQLite

  3. Présentation du TP3

  4. Temps de brainstorm en équipe TP3

Objectifs

  • Comprendre comment utiliser SQLite sous Android

  • Mettre en pratique l'utilisation de SQLite sous Android

Introduction

Mise en contexte 1

  • Et si il n’y a plus de Wifi ?

  • Et si on est sur le réseau cellulaire ?

  • Peut être que notre application n'a pas besoin de stocker l'info sur un serveur...

  • Etc.!

Pourquoi utiliser une base de données sur le téléphone si on a un serveur web pour ça ?

Introduction

Mise en contexte 2

  • Dans 99,999999% des cas, la base de données d’une application mobile n’est pas directement sur l’appareil.
  • ­Elle est située sur un serveur, dont l’accès se fait par des appels en HTTP.
  • Par contre, stocker des données en cache peut être fort utile pour :
    • ­Lorsque la connexion internet est absente.
    • ­Lorsque la connectivité est limité (3G ou 4G).

Mobile et cloud : Une histoire d’amour

Introduction

Mise en contexte 3

  • Android contient SQLite directement dans la plateforme.
    • Depuis la toute première version Android.

 

  • Chaque application peut avoir sa propre base de données privée.
    • ­Le fichier « .db » est stocké avec les fichiers de l’application.

 

  • Fort utile pour stocker des données temporaires.

Sqlite et Android

Comment l’utiliser ?

Sqlite et Android

Installation

  • Il n’y a rien à faire pour l’installation. Tout est déjà prêt. Pas d’autorisations à donner!

 

  • Il faut tout simplement créer quelques classes :
    • ­Un « DatabaseTable ».
    • ­Un « SQLiteOpenHelper ».

 

Sqlite et Android

SQL et SQLite

  • D'une base de données à l’autre, le langage SQL diffère un peu.
  • Si votre base de données ne marche pas, vérifiez les messages d’erreur dans le « AndroidMonitor ».

ATTENTION!!!
SQL n’est pas un langage si standardisé que cela!

À ce jour, avez-vous déjà vécu des différences en utilisant du code SQL?

Sqlite et Android

MySQL VS SQLite

  • Vous connaissez déjà MySQL...
  • Individuellement durant 2 minutes cherchez les différences entre MySQL et SQLite
  • En équipe de 2, discutez de ces différences (3 min)
  • Retour en groupe, 5 minutes pour voir vos réponses

Sqlite et Android

Constantes de requêtes

  • Créez une classe de constantes qui contient vos requêtes SQL.
    • Create Table, Drop Table, Select, Insert, Update, Delete
  • Faites une classe par table avec des requêtes préparées.

ATTENTION!!!
Créez un constructeur privé pour empêcher l’instanciation de cette classe!

Pourquoi?

Sqlite et Android

Constantes pour les requêtes SQL

public class MyTableDatabaseTable {
    public static final String CREATE_TABLE_SQL = 
		"CREATE TABLE myTable (" +
		"id              INTEGER    PRIMARY KEY    AUTOINCREMENT," + 
		"someText        TEXT," + 
		"someNumber      INTEGER)";
    public static final String DROP_TABLE_SQL = 
		"DROP TABLE myTable";

    public static final String INSERT_SQL = "INSERT INTO myTable (someText, someNumber) VALUES(?, ?)";
    public static final String SELECT_ALL_SQL = "SELECT id, someText, someNumber FROM task";

    private MyTableDatabaseTable() {
        //Private constructor to prevent instantiation
    }
}
// J'aime le thème Monokai ;)

Sqlite et Android

Requêtes préparées

Pourquoi faire des requêtes préparées?

  • ­Sinon, il risque d’y avoir « Injection SQL ». (C'est quoi?)

  • Les « trous » dans les requêtes SQL sont représentés par des « ? » sous SQLite.

  • C'est plus sécuritaire et plus rapide, car les requêtes préparées sont compilées qu’une seule fois.

Sqlite et Android

SQLiteDatabase

  • La classe SQLiteDatabase sert à faire des requêtes à la base de données.

    • Vous ne pouvez pas l’instancier directement : vous devez passer par Android.

    • Entre en scène le SQLiteOpenHelper.

  • Le SQLiteOpenHelper s’occupe de créer la base de données et ses tables automatiquement pour vous dès la première utilisation de la base de données.

Sqlite et Android

SQLiteOpenHelper

S’occupe de créer la BD et d’y fournir une connexion.

public class ApplicationDatabaseHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;

    public ApplicationDatabaseHelper(Context context, String databaseFileName) {
        super(context, databaseFileName, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //Faire ceci pour chaque table que vous avez
        sqLiteDatabase.execSQL(MyTableDatabaseTable.CREATE_TABLE_SQL);
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        //Faire ceci pour chaque table que vous avez
        sqLiteDatabase.execSQL(MyTableDatabaseTable.DROP_TABLE_SQL);
        onCreate(sqLiteDatabase);
    }
}

Sqlite et Android

Obtenir la base de données

ATTENTION!!!
N’oubliez pas d’appeler « close » sur votre SQLiteOpenHelper à « onDestroy » !!

Pourquoi?

Sqlite et Android

Ouvrir/Fermer La base de données

private ApplicationDatabaseHelper applicationDatabaseHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    applicationDatabaseHelper = 
        new ApplicationDatabaseHelper(this, DATABASE_FILE_NAME);
		SQLiteDatabase sqLiteDatabase = 
			applicationDatabaseHelper.getWritableDatabase();
}

@Override
protected void onDestroy() {
    super.onDestroy();
	
    if (applicationDatabaseHelper != null) {
		applicationDatabaseHelper.close();    
	}
}

Sqlite et Android

Faire une requête à la base de données

  • Sur votre SQLiteDatabase, utilisez la méthode « rawQuery » pour exécuter une requête SQL de n’importe quel type.

    • Le premier paramètre est la requête SQL à compiler et à exécuter.

    • Le second paramètre est un tableau de « String » contenant les valeurs des paramètres de la requête.

ATTENTION!!!
La façon montrée n’est pas celle montrée sur le site AndroidDeveloppers.

public List<MyObject> retrieveAll() {
    Cursor cursor = null;
    try {
        cursor = sqLiteDatabase.rawQuery(MyObjectDatabaseTable.SELECT_ALL_SQL, 
            new String[]{});

        List<MyObject> myObjects = new LinkedList<>();
        while (cursor.moveToNext()) {
            MyObject myObject = new MyObject();
            myObject.setId(cursor.getInt(0));
            myObject.setSomeText(cursor.getString(1));
            myObject.setSomeNumber(cursor.getInt(2));
            myObjects.add(MyObject);
        }
        return myObjects;
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

Sqlite et Android

Faire une requête de Lecture

  •  L’envoi des paramètres pour les requêtes préparées se fait dans le tableau de « String » envoyé à la méthode « rawQuery ».

Sqlite et Android

Faire une requête de Lecture

database.rawQuery(MyObjectDatabaseTable.SELECT_ALL_SQL, new String[]{});
 
  • Les paramètres sont envoyés dans l’ordre que les « ? » apparaissent.

 

  •  N’oubliez pas de convertir en « String » vos variables au besoin.

Sqlite et Android

Faire une requête d’écriture 1

public void create(MyObject myObject) {
    Cursor cursor = null;
    sqLiteDatabase.beginTransaction();
    try {
        cursor = sqLiteDatabase.rawQuery(MyTableDatabaseTable.INSERT_SQL, new String[]{
                myObject.getSomeText(),
                String.valueOf(myObject.getSomeNumber())
        });
        cursor.moveToLast(); //Nécessaire pour effectuer l'écriture
        sqLiteDatabase.setTransactionSuccessful(); //Pour confirmer que l'écriture peut se faire
    } finally {
        if (cursor != null) {
            cursor.close();
        }
        sqLiteDatabase.endTransaction();
    }
}

Sqlite et Android

Faire une requête d’écriture 2

ATTENTION!!!

Si vous ne faites pas « cursor.moveToLast() », l’écriture ne se fera jamais dans la base de données.

Pourquoi?

Aussi, il faut confirmer que la transaction s’est bien effectuée avec « setTransactionSucessful() ».

Qu'est-ce qu'une transaction en BD?

Sqlite et Android

Obtenir le dernier ID Créé

ATTENTION!!!

N’oubliez pas de mettre toutes vos requêtes en constantes!!

cursor = sqliteDatabase.rawQuery("SELECT last_insert_rowid()", new String[]{});
cursor.moveToNext();
myObject.setId(cursor.getLong(0));

Sqlite et Android

Démo sur YouTube

Conclusion

Documentation

Conclusion

La fin?

Progmobile - Présentation 17

By Jimmy Gilbert

Progmobile - Présentation 17

Les bases de données mobiles

  • 656