0% ont trouvé ce document utile (0 vote)
29 vues9 pages

Android Ch7 Suite 2024

Le document traite de la gestion des fichiers et de l'utilisation de bases de données SQLite dans les applications Android. Il décrit comment accéder aux fichiers, gérer les permissions, et interagir avec SQLite pour effectuer des opérations de lecture, écriture, suppression et mise à jour. De plus, il mentionne l'API Room comme une abstraction moderne pour manipuler SQLite sans opérations de bas niveau.

Transféré par

Khawla khawla
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
29 vues9 pages

Android Ch7 Suite 2024

Le document traite de la gestion des fichiers et de l'utilisation de bases de données SQLite dans les applications Android. Il décrit comment accéder aux fichiers, gérer les permissions, et interagir avec SQLite pour effectuer des opérations de lecture, écriture, suppression et mise à jour. De plus, il mentionne l'API Room comme une abstraction moderne pour manipuler SQLite sans opérations de bas niveau.

Transféré par

Khawla khawla
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

try {

FileOutputStream out =

6.3 Les fichiers openFileOutputStream("fichier", MODE_PRIVATE);


...
} catch (FileNotFoundException e) { ... }
Android fournit aussi un accès classique au
système de fichier pour tous les cas qui ne sont
pas couverts par les préférences ou la Les ressources permettent aussi de
persistance des activités, c'est à dire de récupérer un fichier embarqué dans
nombreux cas. Le choix de Google est de
l'application:
s'appuyer sur les classes classiques de Java EE
tout en simplifiant la gestion des permissions et Resources res = getResources();
des fichiers embarqués dans l'application. InputStream is =
res.openRawResource(R.raw.fichier);
Pour la gestion des permissions, on retrouve
comme pour les préférences les constantes
A noter: les fichier sont à éviter. Mieux vaut
MODE PRIVATE et
MODE_WORLD_READABLE/WRITABLE à passer alléger l'application au maximum et prévoir
en paramètre de l'ouverture du fichier. En le téléchargement des ressources
utilisant ces constantes comme un masque, on nécessaires à partir d’un serveur.
peut ajouter | MODE_APPEND pour ajouter des
données. 129
Les fichiers : support de stockage externe

chemin pour stocker des fichiers qui doivent


Permissions : être supprimés à la désinstallation de
l’application :
<uses-permission getExternalFilesDir()
android:name="android.permission.WRITE_EXTERN
AL_STORAGE" android:maxSdkVersion="18" /> chemin pour stocker des fichiers qui doivent
rester après la désinstallation de l’application :
getExternalStoragePublicDirectory()
Vérification :

public boolean isExternalStorageWritable() {


accéder à un fichier dans un répertoire standard
String state = publique : (eg. photos)
Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) { File file = new
return true; File(Environment.getExternalStoragePublicDirectory(
} Environment.DIRECTORY_PICTURES),
return false; “album/image.jpg”);
}

130
6.4 BDD SǪLite public class TchatOpenHelper extends SQLiteOpenHelper {

private static final String SQL_CREATE =


Android dispose d'un SGBD "CREATE TABLE tchatcontact (
nom_du_champ_1 INTEGER PRIMARY KEY,
relationnel appelé SQLite. Même
nom_du_champ_2 TEXT NOT NULL,
si la base doit être utilisée avec nom_du_champ_3 REAL NOT NULL CHECK (nom_du_champ_3 > 0),
nom_du_champ_4 INTEGER DEFAULT 10);";
modération, cela fournit un
moyen efficace de gérer une TchatOpenHelper(Context context) {
super(context, "tchatcontacts", null, 3);
petite quantité de données. }

Ici un exemple classique de @Override


public void onCreate(SQLiteDatabase db) {
création de base de données, ce db.execSQL(SQL_CREATE);
}
qui se fait en héritant de @Override
SQLiteOpenHelper: public void onUpgrade(SQLiteDatabase db, int old, int new) {
//politique de MAJ de la BDD

}
}

131
Il est aussi possible de déclarer des contraintes
pour chaque attribut. On trouve comme
Types de données principales contraintes :

Pour SQLite, c'est simple, il n'existe que cinq ● PRIMARY KEY, FOREIGN KEY pour désigner
types de données : une clé primaire ou étrangère ;
● AUTOINCREMENT pour un attribut
● NULL pour les données NULL. numérique auto-incrémentable;
● INTEGER pour les entiers (sans virgule). ● NOT NULL pour indiquer que cet attribut
● REAL pour les nombres réels (avec ou
ne peut valoir NULL ;
sans virgule).
● UNIQUE pour indiquer une valeur unique;
● TEXT pour les chaînes de caractères. ● CHECK afin de vérifier que la valeur de cet
● BLOB pour les données brutes, par
attribut est cohérente ;
exemple si vous voulez mettre une
● DEFAULT sert à préciser une valeur par
image dans votre base de
défaut.

● ... 132
Lecture / Écriture dans une BDD: Sélection
Pour réaliser des écritures ou lectures, on L'objet de type Cursor permet de traiter la réponse (en
utilise les méthodes getWritableDatabase() lecture ou écriture), par exemple:
et getReadableDatabase() qui renvoient
une instance de SQLiteDatabase. Sur cet ● getCount(): nombre de lignes de la réponse
● moveToFirst(): déplace le curseur de réponse à la
objet, une requête peut être exécutée au
première ligne
travers de la méthode query():
● getInt(int columnIndex): retourne la valeur (int)
public Cursor query (boolean distinct, String de la colonne passée en paramètre
table, String[] columns, ● getString(int columnIndex): retourne la valeur
String selection, String[] selectionArgs, String
(String) de la colonne passée en paramètre
groupBy, String having, String orderBy, String
limit) ● moveToNext(): avance à la ligne suivante
● getColumnName(int): donne le nom de la
Req: d’autres solutions existent comme: colonne désignée par l'index
● ...
public Cursor rawQuery(String sql, String[]
selectionArgs)
133
Lecture / Écriture dans une BDD: Suppression
Exemple :
La méthode utilisée pour supprimer est quelque peu
différente. Il s'agit de int delete(String table, public void supprimer(long id) {
String whereClause, String[] whereArgs). L'entier
renvoyé est le nombre de lignes supprimées. Dans cette getWritableDatabase().delete(TABLE_NAME, "
méthode : id = ?", new String[] {String.valueOf(id)});
● table est l'identifiant de la table.
● whereClause correspond au WHERE en SQL. Par }
exemple, pour sélectionner la première valeur dans la
table Metier, on mettra pour whereClause la chaîne «
id = 1 ». En pratique, on préférera utiliser la chaîne « id
= ? » et je vais vous expliquer pourquoi tout de suite.
● whereArgs est un tableau des valeurs qui
remplaceront les « ? » dans whereClause. Ainsi, si
whereClause vaut « LIKE ? AND salaire > ? » et qu'on
cherche les métiers qui ressemblent à « ingénieur avec
un salaire supérieur à 1000 € », il suffit d'insérer dans
whereArgs un String[] du genre {"ingenieur", "1000"}.

134
Lecture / Écriture dans une BDD: Insertion
Après avoir récupéré une instance de base de donnée en
pour insérer une entrée, on utilisera la méthode : mode écriture, on peut faire:

long insert(String table, String ContentValues row = new ContentValues();


nullColumnHack, ContentValues values), qui
renvoie le numéro de la ligne ajoutée où :
row.put(“id”, 657882);
● table est l'identifiant de la table dans laquelle
insérer l'entrée. row.put(“nom”, “Hamdane”);
● nullColumnHack est le nom d'une colonne à
utiliser au cas où vous souhaiteriez insérer une mDb.insert(TABLE_NAME, null, row);
entrée vide (souvent mise à null).
● values est un objet qui représente l'entrée à
insérer.
Les ContentValues sont utilisés pour insérer des
données dans la base. Ainsi, on peut dire qu'ils
fonctionnent un peu comme les Bundle par exemple,
puisqu'on peut y insérer des couples identifiant-valeur,
qui représenteront les attributs des objets à insérer
dans la base.
135
Lecture / Écriture dans une BDD: Modification
Exemple :
La syntaxe est très similaire à la précédente :
ContentValues value = new ContentValues();

int update(String table, ContentValues values, String


value.put(“nom”, “ABBASSI”);
whereClause, String[] whereArgs)
mDb.update(TABLE_NAME, value, "id = ?", new
On ajoute juste le paramètre values pour représenter les
String[] {String.valueOf(657882)});
changements à effectuer dans le ou les enregistrements
cibles.

136
L’API Room
● Pour utiliser Room il faut faire appel aux
● C’est une API récente qui permet de dépendances suivantes:
manipuler SQLite sans faire recours à
dependencies {
des opérations de bas niveau, def room_version = "2.3.0"

● Elle fait partie de Android Jetpack implementation


● Room offre un certain niveau "androidx.room:room-runtime:$room_version"
annotationProcessor
d’abstraction grâce à l'intégration "androidx.room:room-compiler:$room_version"
d’objets DAO qui facilitent l’accès aux implementation
"androidx.room:room-rxjava2:$room_version"
données.
implementation
● Exemple d’implémentation : "androidx.room:room-rxjava3:$room_version"

implementation "androidx.room:room-guava:$room_version"
https://developer.android.com/training/data-s
testImplementation
torage/room
"androidx.room:room-testing:$room_version"
}

137

Vous aimerez peut-être aussi