Chapitre 04cds

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 50

Les bases de données

avec SQLite

1
Introduction
• Est un SGBD relationnel, léger, gratuit et Open Source
• Très utilisé dans le domaine des appareils mobiles
• Il fournit un support de bases de données relationnelles simplifiée
pour tenir sur une tablette.
• Ce qui lui manque :
• Pas de gestion des utilisateurs (pas de sécurité).
• Pas de réglages pour améliorer les performances
• Peu de types de données
• Fonctionne sans serveur, il stocke les données dans un fichier
portable (i.e. dire copiable sur n’importe quelle autre machine).
2
Introduction

 Une application peut stocker des données dans une ou plusieurs bases
de données SQLite
 Les bases de données sont privées à l'application qui les a créées
– Pour les partagées (les rendre publiques), on doit passer par un
fournisseur de contenu (ContentProvider)

3
Syntaxe SQLite
 Type de données:
• INTEGER : nombres entiers, signés ou non
• REAL : nombres réels
• TEXT : données textuelles
• BLOB : stockage de données sous forme binaire
• NULL : si la donnée est nulle

Syntaxe SQLite:
• Toutes les requêtes SQL que vous connaissez fonctionnent.
• Exemples SQL:
• SELECT COUNT(*) FROM Person WHERE nom LIKE ‘M%';
• SELECT * FROM Person WHERE age> 20 ORDER BY age;
• SELECT AVG(age) AS moyenne FROM Person GROUP BY ……….;
• DELETE FROM Person WHERE nom=“Mohamed”;
4
Syntaxe SQLite

 Création d’une table:


CREATE TABLE table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype);

 Suppression d’une table:


DROP TABLE table_name;

5
Syntaxe SQLite
 La requête INSERT INTO
1. On spécifier les noms des colonnes et les valeurs à insérer:
INSERT INTO TABLE_NAME [(column1, column2,...columnN)] VALUES
(value1, value2,...valueN);

2. Si on ajoute des valeurs pour toutes les colonnes de la table, on peut ne pas spécifier les
noms des colonnes.
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

6
Syntaxe SQLite
 La requête SELECT
• Requête simple:
SELECT column1, column2,..., columnN FROM table_name;

• Requête SELECT avec condition:


SELECT column1, column2, columnN
FROM table_name
WHERE [CONDITION];

• Requête SELECT avec plusieurs conditions:


SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] AND [condition2]... OR [conditionN];
7
Syntaxe SQLite
 La requête UPDATE
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

 La requête DELETE
DELETE FROM table_name
WHERE [condition];

8
SQLite dans une application Android

 Recommandations
• Il est recommandé de définir une classe associée à chaque table(Ça permet de faire
évoluer le logiciel assez facilement).
• Les instances de la classe sont les n-uplets de la table.
• Définir une classe qui regroupe toutes les requêtes SQL la concernant : création,
suppression, mise à jour, parcours, insertions. . . sous forme de méthodes de classe.

• Une BDD SQLite est un fichier *.db placé dans le dossier


/data/data/PAQUETAGE/databases/NOM_BDD

9
Classes pour travailler avec SQLite

 La classe SQLiteDatabase
• Représente une BDD.
• Ses méthodes permettent d’exécuter une requête, par exemple :
void execSQL(String sql) pour CREATE, ALTER, DROP. . . qui ne retournent pas de données.
Cursor rawQuery(String sql, ...) pour des SELECT qui retournent des n-uplets.

 Les méthodes de la classe SQLiteDatabase:


La méthode rawQuery:
• Cette méthode permet d’exécuter des requêtes de type SELECT.
• Elle retourne un objet de type Cursor qui permet de parcourir les n-uplets un à un :
• Exemple: (soit bdd un objet de type SQLiteDatabase)
• Cursor cursor = bdd.rawQuery("SELECT * FROM Etudiant WHERE...");
10
Classes pour travailler avec SQLite

 Les méthodes de la classe SQLiteDatabase: (suite)


La méthode execSQL : Cette méthode exécute une requête SQL qui ne retourne pas
d’informations : CREATE, INSERT. . .
•void execSQL(String sql) : on doit fournir la requête sous forme d’une chaîne.
• Exemple :
bdd.execSQL("DROP TABLE Etudiant");

•void execSQL(String sql, String[] Args) : c’est pour le même type de requête
mais contenant des jokers ? à affecter avec les chaînes fournis en paramètre.
• Exemple :
bdd.execSQL("DELETE FROM Etudiant WHERE nom=?
AND prenom=?", new String[] { Amine, Mohamed});
11
Classes pour travailler avec SQLite
 Les méthodes de la classe SQLiteDatabase: (suite)
Méthodes spécialisées
•int insert(String table, null, ContentValues val)
•retourne l’identifiant du nouveau n-uplet
• int update(String table, ContentValues val,
String whereClause, String[] Args)
• int delete(String table, String whereClause, String[] Args)
• update et delete retournent le nombre de n-uplets modifiées.

•Les paramètres sont :


• table : le nom de la table
• val : une structure du type ContentValues qui associe des noms et des valeurs :
• whereClause : une condition contenant des jokers ?
• whereArgs : chaînes à mettre à la place des ?
12
Classes pour travailler avec SQLite
 Les méthodes de la classe SQLiteDatabase: (suite)

Méthodes spécialisées (suite)

• Exemples:
ContentValues valeurs = new ContentValues();
valeurs.put("nom", "Amine");
valeurs.put("prenom", "Mohamed");
bdd.update("Etudiant", valeurs, "matricule=?",
new String[] { "D0014" });
bdd.delete("Etudiant", "age BETWEEN ? AND ?",
new String[]{"20","22"});

13
Classes pour travailler avec SQLite

 La classe Cursor
• Permet de parcourir le résultat d’une requête SELECT.

• Méthodes de la classe Cursor


• getCount() : retourne le nombre de ligne (le nombre d’enregistrement),
• getColumnCount() : retourne le nombre de colonnes
• moveToFirst() : positionner le curseur sur le premier
• isAfterLast() : retourne vrai si le parcours est fini
• moveToNext() : passe à la ligne suivante.
• getInt(i), getLong(i), getString(i), ... : récupérer la valeur de la colonne i.

14
 La classe SQLiteOpenHelper

• Android fournit la classe SQLiteOpenHelper qui permet de faciliter la gestion d’une base
de données.
• Le développeur doit créer une classe qui la spécialise, il faut redéfinir deux méthodes :
• une méthode de création
public void onCreate(SQLiteDatabase db)
• une méthode de mise à jour
public void onUpgrade(SQLiteDatabase db, int odlVersion, int newVersion)
où ● db est la base de données manipulée
● oldVersion est la version précédente de la base de données
● newVersion la nouvelle version de la base de données

15
 La classe SQLiteOpenHelper

• Une sorte d’écouteur avec deux méthodes à surcharger :


• onCreate() : cette méthode est appelée quand la base de données n’existe pas
encore. Son rôle est de créer les tables.

• onUpgrade() : cette méthode est appelée quand la nouvelle version de la base


de données est supérieure à la version précédente (newVersion > oldVersion) .
Son rôle est de mettre à jour les tables de la base de données.

• Autres méthodes:
• getReadableDatabase pour ouvrir la base de données en mode lecture.
• getWritableDatabase pour ouvrir la base de données en mode ecriture.

16
Exemple:
 Ecrire un programme Android qui permet de stocker une liste d’étudiants dans
une base de données SQLite

1. La classe Etudiant

public class Etudiant {


public String matricule, nom, prenom;
public Etudiant(String matricule, String nom, String prenom){
this.matricule=matricule; this.nom=nom; this.prenom=prenom;
}
}

17
Exemple: (suite)
2. Une classe pour gérer la BDD
public class DBExemple extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "dbcours";

public DBExemple(Context context) { super(context, DB_NAME, null, DB_VERSION); }


@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE etudiant(matricule TEXT PRIMARY KEY, nom TEXT, prenom TEXT)";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS etudiant");
onCreate(db);
}
public Etudiant getEtudiant(String matricule) { … }
public void addEtudiant(Etudiant e) { …. }
18
}
Exemple: (suite)
2. Une classe pour gérer la BDD (suite)
public class DBExemple extends SQLiteOpenHelper {
…..
public Etudiant getEtudiant(String matricule) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor= db.rawQuery("Select * from etudiant where matricule=?",new String[]{matricule});
if (cursor.getCount()==0) return null;
cursor.moveToFirst();
Etudiant e = new Etudiant(cursor.getString(0), cursor.getString(1), cursor.getString(2));
return e;
}
public void addEtudiant(Etudiant e) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues val = new ContentValues();
val.put("matricule", e.matricule); val.put("nom", e.nom); val.put("nom", e.prenom);
db.insert("etudiant",null,val);
db.close();
}
} 19
Exemple: (suite)
3. L’activité Android:
public class MainActivity extends AppCompatActivity {
EditText editmat, editnom, editprenom;
DBExample mydb;
@Override
protected void onCreate(Bundle savedInstanceState) {
……
editmat=this.findViewById(R.id. editmat);
……
mydb=new DBExample(this);
}
public void ajouter(View v){
….
Etudiant e=new Etudiant(editmat.getText(). toString(), editnom.getText(). toString(),
editprenom.getText(). toString());
mydb.addEtudiant(e);
}
} 20
CursorAdapter
• Est un Adaptateur qui expose les données d'un Cursor à un ListView.
• Cursor est une classe qui permet de parcourir le résultat d’une requête SELECT.
• Il suffit d’étendre la classe CursorAdapter et redéfinir les méthodes newView() et
bindView()
• Le constructeur de la classe héritant de la classe CursorAdapter possède deux
paramètres:
• context: le contexte de l’application.
• cursor: résultat d’une requête SELECT.

public MyCursorAdapter(Context context, Cursor cursor) {


super(context, cursor, 0);
}

21
CursorAdapter

• La méthode newView():
• est utilisée pour instancier une nouvelle vue et la renvoyer.

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_layout, parent,
false);
}

Avec: item_layout est le fichier décrivant les items de ListView (res/layout/item_layout.xml)

22
CursorAdapter
• La méthode bindView():
• Est utilisée pour lier les données à une vue donnée.
• Exemple
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Les champs à remplir dans la vue de l’item
TextView edit_nom= (TextView) view.findViewById(R.id.editnom);
TextView edit_prenom= (TextView) view.findViewById(R.id.editprenom);

// Extraction des données du curseur


String str_nom= cursor.getString(0);
// 0 est la position de colonne nom
String str_prenom= cursor.getString(1);
// 1 est la position de colonne prenom

// Remplir les champs par les données extraites


edit_nom.setText(str_nom);
edit_prenom.setText(str_prenom); 23
}
CursorAdapter

 Récupération du curseur:
• Pour utiliser un CursorAdapter, nous devons interroger une base de données SQLite et
récupérer un Cursor représentant le résultat.
• Nous pouvons utiliser SQLiteOpenHelper qui donne accès à la base de données sous-jacente.
• Nous utilisons la méthode rawQuery qui renvoie un Cursor.

Exemple:
// DBExemple est une sous classe de la classe SQLiteOpenHelper
DBExemple mydbh= new DBExemple (this);
SQLiteDatabase db = mydbh.getReadableDatabase();
Cursor cursor= db.rawQuery("SELECT * FROM etudiant", null);

24
CursorAdapter

 Attacher l'adaptateur à un ListView:


• L'adaptateur est utilisé dans l'activité pour afficher un ensemble d'éléments dans un
ListView

Exemple:
// Trouver ListView à remplir (lv est l’identifiant de ListView)
ListView lv= this.findViewById(R.id.lv);
// Création de l’adaptateur
MyCursorAdapter adapter= new MyCursorAdapter(this, cursor);
// Attacher l’adaptateur au ListView
lv.setAdapter(adapter);

25
CursorAdapter liste_etudiant.xml
<RelativeLayout ......>
<ListView
Exemple: android:layout_width="....."
android:layout_height="...."
android:id="@+id/lv"></ListView>
</RelativeLayout>
Item_layout.xml

26
CursorAdapter
Exemple:

Coté adaptateur:
public class MyCursorAdapter extends CursorAdapter {
public MyCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
// The newView method is used to inflate a new view and return it
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_layout, parent,
false);
}

27
CursorAdapter
Exemple: Coté adaptateur (suite)
// The bindView method is used to bind all data to a given view
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Find fields to populate in inflated template
TextView txtmat = (TextView) view.findViewById(R.id.txtmat);
TextView txtnom = (TextView) view.findViewById(R.id.txtnom);
TextView txtprenom = (TextView) view.findViewById(R.id.txtprenom);
// Extract properties from cursor
String mat = cursor.getString(1);
String nom = cursor.getString(2);
String prenom = cursor.getString(3);
// Populate fields with extracted properties
txtmat.setText(mat);
txtnom.setText(nom);
txtprenom.setText(prenom);
}
} 28
CursorAdapter
Exemple:

Coté activité:
public class Liste_Etudiant extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_liste__etudiant);
DBHandler mydb=new DBHandler(this);

// Récupérer tous le contenu de la table


Cursor cursor = mydb.getEtudiants();// une méthode qui renvoi le table étudiant
MyCursorAdapter adapter=new MyCursorAdapter(this, cursor);
ListView lv=(ListView)this.findViewById(R.id.lv);
lv.setAdapter(adapter);
}
}
29
JSON

30
JSON ( JavaScript Object Notation)

• JSON est un format d'échange de données à travers le réseau

• JSON est un format léger d’échange de données (Plus léger que XML)

• Il est facile à écrire et lire, facilement analysable

•Sa structure se base sur une collection de couple “Nom / Valeur”

•La plate-forme Android inclut les bibliothèques json qui permettent de travailler
facilement avec des fichiers JSON.

31
 Les éléments de JSON

• Les crochets “[ ]” représentent un tableau JSON “JSONArray”

• Les accolades “{ }” représentent un objet JSON "JSONObject "

• Un objet JSON est une paire Clé/Valeur

• Une clé est une chaîne de caractères.

• Chaque clé a une valeur de type String, Integer, double, …

32
 Exemple de JSON:

[
{ "matricule":"B2014",
"nom":"Tom",
"prenom":"Jerry"
},
{ "matricule":"B2015",
"nom":"Amine",
"prenom":"Omar"
},
{ "matricule":"B2016",
"nom":"Karima",
"prenom":"Imane"
}
]
33
 Lire du JSON
• Android fournie différentes classes pour manipuler les données JSON
 Exemple: JSONArray, JSONObject,…

• JSONArray: représente un tableau d’objet JSON


 La méthode length()retourne la taille de tableau
 La méthode getJSONObject(i)retourne l’objet JSON de la position i

• Exemple:
String strJson="[{\"matricule\":\"B2014\",\"nom\":\"Tom\",\"prenom\":\"Jerry\"},
{\"matricule\":\"B2015\",\"nom\":\"Amine\",\"prenom\":\"Omar\"},
{\"matricule\":\"B2016\",\"nom\":\"Karima\",\"prenom\":\"Imane\"}]";
JSONArray arrayJson = new JSONArray(strJson);
for (int i = 0; i < arrayJson.length(); i++) {
JSONObject j=arrayJson.getJSONObject(i);
... ...
}
34
 Lire du JSON

• JSONObject: représente un objet JSON (paires de clé / valeur )


 Pour lire une valeur, on utilise les méthodes getString(String Key),
getInt(String Key), getDouble(String Key), etc. (key est la clé).

• Exemple:
String strJson="[{\"matricule\":\"B2014\",\"nom\":\"Tom\",\"prenom\":\"Jerry\"}...]";
JSONArray arrayJson = new JSONArray(strJson);
JSONObject j=arrayJson.getJSONObject(0);
String str_mat=j.getString("matricule"); // str_mat=B2041
String str_nom=j.getString("nom"); // str_nom=Tom
String str_prenom=j.getString("prenom"); // str_prenom=Jerry

35
 Lire du JSON

• Lire toutes les données JSON


String strJson= "[{\"matricule\":\"B2014\",\"nom\":\"Tom\",\"prenom\":\"Jerry\"},
{\"matricule\":\"B2015\",\"nom\":\"Amine\",\"prenom\":\"Omar\"},
{\"matricule\":\"B2016\",\"nom\":\"Karima\",\"prenom\":\"Imane\"}]";

JSONArray arrayJson = new JSONArray(strJson);

for (int i = 0; i < arrayJson.length(); i++) {


JSONObject j=arrayJson.getJSONObject(i);
String str_mat=j.getString("matricule");
String str_nom=j.getString("nom");
String str_prenom=j.getString("prenom");
Etudiant e=new Etudiant(str_mat, str_nom, str_prenom);
... ...
// on peut sauvegarder les informations dans un tableau ArrayList
// ou dans une BDD SQLite
}
36
 Connexion à un serveur de base de données

 Il existe plusieurs procédures qui


permettent, depuis un client Android, de
se connecter à une base de données.

 Une des méthodes, consiste à l'utilisation


d'un fichier PHP qui convertit les données
récupérées en format JSON.

 En PHP, la fonction json_encode() permet


d'encoder en JSON.

37
 Connexion à un serveur de base de données

I. Coté serveur

1. Base de données:
Un SGBD (ex: mysql, … ) et une base de
données (ex: base de donnée dbtest contient
une table etudiant(matricule, nom, prenom) ).

2. Fichier PHP:
Un scripte PHP consiste à envoyer des requêtes SQL à la base de
données dbtest qui contient la table etudiant. Il récupère le résultat des
requêtes, ensuite l'encode en JSON grâce a la fonction json_encode().

38
 Connexion à un serveur de base de données
• Exemple de scripte PHP

<?php
try {
// connexion à la base de données.
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=dbtest', 'root', '', $pdo_options);
// Executer une requête SQL.
$sql = 'SELECT * FROM etudiant;';
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
// encoder le résultat en JSON.
echo(json_encode($output));
?> 39
 Connexion à un serveur de base de données
II. Coté Client Android
Au niveau du Client Android, il s'agit de:
 Demander au serveur de renvoyer les données grâce aux commandes HttpURLConnection,
en indiquant le chemin du fichier PHP à interroger
• Remarque: l'adresse locale pour l'emulateur Android est 10.0.2.2.
(ex: String url = "http://10.0.2.2/testandroid/data.php";).

 Lire le flux d’entrée (réponse de serveur)


• Android fournie les classes: InputStreamReader, BufferedReader, StringBuilder
pour lire le flux d’entrée.
 Conversion du flux reçu (InputStream) en chaine de caractères.

 Récupération (décodage) des données (car elles sont renvoyées sous forme JSON).
 Remarque:
• Il faut que l’application soit autorisée à accéder à internet. Ajouter la permission
<uses-permission android:name="android.permission.INTERNET"/> 40
 Connexion à un serveur de base de données
II. Coté Client Android

Exemple: Demander au serveur


String url = "http://10.0.2.2/testandroid/data.php";
InputStream in = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setReadTimeout(10000); //milliseconds
conn.setConnectTimeout(15000); // milliseconds
conn.setRequestMethod("GET"); // choisir la méthode get
conn.setDoInput(true); // true pour lire les données
conn.connect(); // Etablir la connexion
in = conn.getInputStream(); // récuperer le flux d’entrée
lireFlux(in); // C’est une fonction qui lit le flux d’entrée (réponse de serveur)
} catch (Exception e){
Log.e("error"," ", e);
}
41
 Connexion à un serveur de base de données
II. Coté Client Android

Exemple: Lire le flux d’entrée


private String lireFlux(InputStream is) throws IOException {
InputStreamReader inr=new InputStreamReader(is);
BufferedReader r = new BufferedReader(inr);
StringBuilder response = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
response.append(line).append('\n');
}
return response.toString();
}

 Pour décoder les données JSON, nous utilisons les classes (JSONArray,
JSONObject, … ) vue précédemment.
42
 Connexion à un serveur de base de données

• Problème:
Une activité Android est exécuté par un seul processus léger, un thread appelé «Main
thread».
Ce thread ne doit jamais travailler plus de quelques fractions de secondes sinon l’interface
paraît bloquée et Android peut décider que l’application est morte.

• Solution:
La solution passe par une séparation des threads, par exemple à l’aide d’une tâche
asynchrone AsyncTask.
C’est un autre thread, indépendant de l’interface utilisateur
L’interface utilisateur peut être mise à jour de temps en temps par le thread AsyncTask.
Il est également possible de récupérer des résultats à la fin de l’exécution de thread
AsyncTask.
43
Connexion à un serveur de base de données

Pour établir une connexion correctement avec un serveur distant:


 Android appelle la callback de l’activité,
 La callback crée un thread AsyncTask puis sort immédiatement,
 Le thread AsyncTask fait le travaille nécessaire,
 Pendant ce temps, l’interface est vide, mais reste réactive,
 Puis le thread AsyncTask affiche les résultats sur l’interface .

44
 Structure d’un thread AsyncTask

Une tâche asynchrone (thread) est définie par plusieurs méthodes :


 Constructeur permet de passer des paramètres à la tâche.
 onPreExecute Initialisation effectuée par le thread principal.
 doInBackground C’est le corps du traitement. Cette méthode est lancée dans son
propre thread. Elle peut durer autant qu’on veut.
 onProgressUpdate Cette méthode permet de mettre à jour l’interface.
 onPostExecute Elle est appelée quand l’AsyncTask a fini.

45
 Paramètres d’une AsyncTask

• Elle est paramétrée par trois types de données : AsyncTask<Params, Progress,


Result>
• Params est le type des paramètres de doInBackground,
• Progress est le type des paramètres de onProgressUpdate,
• Result est le type du paramètre de onPostExecute qui est aussi le type du
résultat de doInBackground.
• Remarque: Le type correspond à des classes, donc Integer au lieu int, et Void au lieu de void, …

 Lancement d’une AsyncTask


On crée une instance de cet AsyncTask et on appelle sa méthode execute.
Les paramètres sont directement fournis à la méthode doInBackground .

46
Connexion à un serveur de base de données

Exemple: La méthode onCreate de l’activité

protected void onCreate(Bundle savedInstanceState) {

......

//GetData est une tâche asynchrone (AsyncTask)


GetData gt=new GetData();
String url = "http://10.0.2.2/testandroid/data.php";
//lancer la tâche
gt.execute(url);
}
47
Connexion à un serveur de base de données

La tâche Asynchrone AsyncTask

private class GetData extends AsyncTask<String, String, String> {

protected String doInBackground(String... url) {


// Connexion au serveur et récupération de données JSON
... ... ...
}

protected void onPostExecute(String result) {


// Lire les données JSON (string) et afficher les données sur l’écran
... ... ...
}
}

48
 Écrire du JSON

 L'écriture du JSON est très simple.


 Il suffit de créer un objet JSON (JsonObject) ou un tableau JSON (JsonArray) et
d'utiliser la méthode put(String clé, valeur)
• valeur peut être de type String, int, double, ….

 Exemple:
JSONObject object = new JSONObject();
try {
object.put("matricule", "B2017");
object.put("nom", "Karim");
object.put("prenom", "Karim");
} catch (JSONException e) { e.printStackTrace(); }

49
50

Vous aimerez peut-être aussi