exemple détaillé-SQLite

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

Tutoriel base de données SQLite sous

Android

Objectifs
• Dans ce tutoriel, vous allez enregistrer les données dans la base de données SQLite à
l'aide d'un exemple simple et effectuer quelques opérations de base (CRUD) de SQLite.
o C: Create
o R: Read
o U: Update
o D: Delete
• Vous apprendrez à utiliser le modèle MVC (Modèle- Vue- Contrôleur). Vous allez séparer
votre projet en packages de modèles, vues et controleurs afin de mieux structurer le
projet
• Vous découvrirez le LayoutInflater et son utilization
• Vous découvrirez l'élément ScrollView
• Vous allez créer une vue (ex: TextView) par programme en utilisant java
• Vous apprendrez à utiliser AlertDialog

Note: Ce projet a été préparé avant la migration vers AndroidX.

Introduction
SQLite est une base de données légère qui est déjà intégrée au framework Android. C'est une
base de données open source qui ne prend que 250 Ko de mémoire au moment de l'exécution.
La base de données SQLite prend en charge un nombre limité de types de données. Ces types
de données sont:

• Text
• Integer
• Real
• BLOB

Ainsi, tous les autres types de données doivent être convertis dans les types de données ci-
dessus avant de les insérer dans la base de données. SQLite prend en charge les fonctionnalités

1
de base de données relationnelles standard telles que la syntaxe SQL, les transactions et la
syntaxe préparée.

Dans cet exemple, nous allons utiliser les opérations suivantes de SQLite:

Create - Créer une nouvelle base de données


Update - Mettre à jour la base de données déjà créée
Insert - Insère une nouvelle entrée dans la base de données
Retrieve- Récupérer une ou plusieurs entrées de la base de données
Update - Mettre à jour les entrées de base de données
Delete - Supprimer des entrées de la base de données

Créer un nouveau projet

2
Créer une base de données
Créez ensuite une nouvelle classe nommée SQLiteHelper et étendez-la avec la classe
SQLiteOpenHelper. SQLiteOpenHelper est une classe d'assistance qui gère la création et la
gestion de versions de la base de données SQLite dans Android. Ainsi, dans la classe
SQLiteHelper, nous allons implémenter les méthodes onCreate (), onUpgrade () et onOpen ()
de la classe SQLiteOpenHelper pour créer la table pour notre application.

Nous allons créer une table d'étudiants avec trois colonnes: ID de type entier, Nom du type
texte et groupe du type texte.

3
4
Dans le code ci-dessus, nous avons créé une table de base de données pour stocker les
informations des etudiants. Ici, nous récupérons l'instance SQLiteDatabase et créons une
nouvelle table de base de données à l'aide de la méthode onCreate () de notre classe
d'assistance. Maintenant, nous pouvons créer les méthodes pour effectuer diverses opérations
liées à la base de données.

Créez deux packages, respectivement Managers et Views. Déplacez la classe MainActivity vers
le package Views et la classe SQLiteHelper vers le package Managers

5
Créer un modèle d'étudiants
Créez un nouveau package "Models". Sous ce package, créez une nouvelle classe “Student”.
La classe Student sera utilisée pour instancier des objets student que nous utiliserons pour
insérer et extraire des données de la base de données.

6
Insérer des informations dans la base de données

Sous le package “Managers”, créez une nouvelle classe StudentHandler.

Étendre la classe SQLiteHelper et créer le constructeur

Pour insérer les données dans la table de base de données, nous avons besoin d'un accès en
écriture à notre base de données. Dans la classe "StudentHandler" nouvellement créée, nous
devons créer une nouvelle instance de notre classe SQLiteHelper pour obtenir l'instance de
base de données.

Ensuite, nous devons créer une méthode qui effectuera l’opération d’insertion. Donc,
commencez par obtenir l'accès en écriture à notre base de données en utilisant:

SQLiteDatabase db = dbHelper.getWritableDatabase();

7
Ensuite, créez un objet ContentValues et ajoutez les informations à l’objet à insérer.
ContentValues est essentiellement une classe utilisée pour stocker l'ensemble de valeurs
pouvant être traitées par ContentResolver.

Enfin, à l'aide de la méthode insert () de l'instance de base de données, ajoutez les valeurs à la
table souhaitée. Nous devons passer le nom de la table de base de données et l'objet
ContentValues en tant qu'arguments pour la méthode insert(). Fermez également l’accès à la
base de données une fois l’insertion terminée.

public int addStudent (Student student) {


SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(dbHelper.KEY_NAME, student.getName());
values.put(dbHelper.KEY_GROUP, student.getGroup());
long insertId = db.insert(dbHelper.TABLE_STUDENTS, null, values);
db.close();
return (int)insertId;
}

Récupérer des informations de la base de données


Nous pouvons récupérer toutes les informations stockées dans notre table ou récupérer un
ensemble d'informations en fonction d'un critère de sélection.
Pour récupérer un ensemble de données de la table, nous avons besoin de l'accès lisible
“readable” de notre instance de base de données.

SQLiteDatabase db = dbHelper.getReadableDatabase();

8
Ensuite, nous utiliserons la méthode query() pour implémenter la condition et récupérer les
données de la table. Il retourne un objet Cursor à travers lequel nous pouvons itérer l'ensemble
des résultats. Voici l'exemple de méthode pour récupérer les données en fonction d'une
condition:

public Student getStudent(int id) {


SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(dbHelper.TABLE_STUDENTS, new String[] { dbHelper.KEY_ID,
dbHelper.KEY_NAME, dbHelper.KEY_GROUP }, dbHelper.KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Student student = new Student(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
return student;
}

Pour récupérer les informations complètes présentes dans la table de base de données, nous
avons besoin d'un accès en écriture à notre instance de base de données. Cela ressemble plus à
une requête SQL où nous sélectionnons toutes les données de la table. Pour effectuer cette
opération, nous allons utiliser la méthode rawQuery() d'instance de base de données. Il
renverra un objet Cursor que nous utiliserons pour extraire l'ensemble des résultats. Voici
l'exemple de code permettant de récupérer les données:

9
public List<Student> getAllStudents() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
List<Student> studentList = new ArrayList<Student>();
String selectQuery = "SELECT * FROM " + dbHelper.TABLE_STUDENTS;
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Student student = new Student(Integer.parseInt(cursor.getString(0)),
cursor.getString(1),cursor.getString(2));
studentList.add(student);
} while (cursor.moveToNext());
}
return studentList;
}

10
Supprimer des informations de la base de données
Pour supprimer des entrées de la table de base de données, nous devons définir un critère de
sélection pour identifier les entrées à supprimer. Nous allons donc utiliser la méthode delete()
de la base de données qui nécessite trois arguments:

• Nom de la base de données


• Clause de selection (“Where”)
• Argument de selection

Combinés, ces arguments créeront une requête de suppression qui fonctionnera exactement
de la même manière qu'une requête SQL. Voici l'exemple de code pour supprimer les données
de la table:
public void deleteStudent(Student student) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete(dbHelper.TABLE_STUDENTS, dbHelper.KEY_ID + " = ?",
new String[] { String.valueOf(student.getId()) });
db.close();
}

Mettre à jour les informations


Nous pouvons mettre à jour les informations dans notre table de base de données en utilisant
la méthode update() de notre instance de base de données. Pour mettre à jour la table, nous
devons ajouter les valeurs dans l'objet ContentValues et définir un critère de sélection pour
identifier les entrées à modifier. Voici l'exemple de code:

11
Nous avons maintenant terminé avec les packages Managers et Models dans lesquels nous
avons créé les opérations de base de données. Nous allons maintenant créer les vues.

Créer l'interface graphique


Placez un bouton "Créer un étudiant"

• Placez un bouton "Créer un étudiant" sur votre res/layout /activity_main.xml


• Supprimer le «Hello World!» TextView
• définir l'attribut de texte du bouton sur «Créer un étudiant»
• Définir la valeur de l'id de bouton sur «@+id/buttonCreateStudent»

Le code devrait ressembler à ceci:

12
Nous allons définir le OnClickListener du bouton “Créer un étudiant”.

On peut identifier le bouton par son identifiant "buttonCreateStudent"

Le code suivant sera placé dans la méthode onCreate(), sous setContentView


(R.layout.activity_main); code de votre fichier MainActivity.java.

Faites un clic droit sur le package “Views”, créez une nouvelle classe
"OnClickListenerCreateStudent" et insérez le code suivant:

13
Préparez le formulaire de saisie d’un etudiant.
Faites un clic droit sur res/layout / è Cliquez sur "New" è Cliquez sur "File"> Nommez-le
"student_input_form.xml".

Placez le code suivant dans student_input_form.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<EditText
android:id="@+id/editTextStudentname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:hint="Nom de l'etudiant"
android:singleLine="true" >

<requestFocus />
</EditText>

<EditText
android:id="@+id/editTextStudentGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editTextStudentname"
android:hint="Groupe de l'etudiant"
android:singleLine="true" />

</RelativeLayout>

14
Montrer le formulaire “créer un étudiant” à l'utilisateur
Retournez et ouvrez votre classe “OnClickListenerCreateStudent.java”.
Ajoutez le code suivant à votre classe (sous la fonction onClick (View view)) pour ouvrir le
dialogue “Créer un etudiant”.

Context context = view.getRootView().getContext();

LayoutInflater inflater = (LayoutInflater)


context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View formElementsView = inflater.inflate(R.layout.student_input_form, null,
false);

final EditText editTextStudentname = (EditText)


formElementsView.findViewById(R.id.editTextStudentname);
final EditText editTextStudentGroup = (EditText)
formElementsView.findViewById(R.id.editTextStudentGroup);

new AlertDialog.Builder(context)
.setView(formElementsView)
.setTitle("Cree un etudiant")
.setPositiveButton("Ajouter",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {

dialog.cancel();
}

}).show();

15
Remarque:

LayoutInflater classe est utilisée pour instancier le fichier XML de mise en page dans les objets
View correspondants.

En d'autres termes, il prend en entrée un fichier XML et construit les objets View à partir de
celui-ci.

Il n'est jamais utilisé directement - utilisez getLayoutInflater() ou getSystemService(String)


pour récupérer une instance LayoutInflater standard qui est déjà connectée au contexte actuel
et correctement configurée pour le périphérique sur lequel vous exécutez.

LayoutInflater.inflate () fournit un moyen de convertir un fichier res/layout /*.xml définissant


une vue en un objet View réel utilisable dans le code source de votre application.

Inflater signifie lire le fichier XML qui décrit une mise en page (ou élément GUI) et créer les
objets réels qui lui correspondent, et ainsi rendre l'objet visible dans une application Android.

Si vous exécutez l'application après avoir ajouté le code ci-dessus. Après avoir appuyé sur le
bouton "Créer un étudiant", vous devriez obtenir le résultat ci-dessous:

16
Enregistrer la saisie de l'utilisateur
Ouvrez la classe OnClickListenerCreateStudent. Dans la méthode onClick() de AlertDialog, nous
enregistrerons les informations de l'étudiant.
En utilisant la classe StudentHandler déjà créée dans le package Managers, nous allons
enregistrer les informations insérées

new AlertDialog.Builder(context)
.setView(formElementsView)
.setTitle("Cree un etudiant")
.setPositiveButton("Ajouter",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Student student=new Student();
String studentName = editTextStudentname.getText().toString();
String studentGroup =
editTextStudentGroup.getText().toString();

student.setName(studentName);
student.setGroup(studentGroup);

int createdStudent= new


StudentHandler(context).addStudent(student);

Toast.makeText(context, "L'etudiant a ete bien enregistre.",


Toast.LENGTH_SHORT).show();

dialog.cancel();
}

}).show();

17
Compter les enregistrements de la base de données Android
SQLite
Dans votre res/layout/activity_main.xml, placez un TextView sous votre bouton "Créer un
étudiant".

18
Maintenant, nous voulons créer la méthode count dans la classe Managers/StudentHandler.
Ouvrez la classe StudentHandler et ajoutez la méthode ci-dessous:

public int count() {


SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "SELECT * FROM " + dbHelper.TABLE_STUDENTS;
int recordCount = db.rawQuery(sql, null).getCount();
db.close();
return recordCount;
}

19
Ouvrez la classe MainActivity, créez la méthode countRecords() et appelez-la dans onCreate()

Nous voulons également afficher le nombre d'étudiants dans la base de données après avoir
enregistré un nouvel étudiant. Ouvrez la classe OnClickListenerCreateStudent et ajoutez la
methode countRecords après avoir créé un nouvel étudiant pour actualiser la valeur TextView.

20
new AlertDialog.Builder(context)
.setView(formElementsView)
.setTitle("Cree un etudiant")
.setPositiveButton("Ajouter",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Student student=new Student();
String studentName = editTextStudentname.getText().toString();
String studentGroup =
editTextStudentGroup.getText().toString();

student.setName(studentName);
student.setGroup(studentGroup);

int createdStudent= new


StudentHandler(context).addStudent(student);

Toast.makeText(context, "L'etudiant a ete bien enregistre.",


Toast.LENGTH_SHORT).show();
countRecords(context,view);
dialog.cancel();
}

}).show();

public void countRecords(Context context,View view) {


int studentCount = new StudentHandler(context).count();
TextView textViewRecordCount = (TextView)
view.getRootView().findViewById(R.id.textViewRecordCount);
textViewRecordCount.setText(studentCount + " enregistrements trouves.");
}

21
Exécutez votre application et essayez de créer un nouvel étudiant. Lorsque l'application est
créée pour la première fois, elle affiche le texte "0 enregistrements trouvés". Après avoir créé
un nouvel étudiant, elle affichera "1 enregistrements trouvés"

22
Lire des enregistrements de la base de données SQLite
Ouvrez le fichier res/layout/activity_main.xml et placez un ScrollView avec un LinearLayout à
l'intérieur sous le TextView “textViewRecordCount”.

23
Dans votre MainActivity.java, créez la méthode readRecords(). Cela affichera les
enregistrements de la base de données sur l'interface utilisateur.

public void readRecords() {

LinearLayout linearLayoutRecords = (LinearLayout)


findViewById(R.id.linearLayoutRecords);
linearLayoutRecords.removeAllViews();

List<Student> students = new StudentHandler(this).getAllStudents();

if (students.size() > 0) {

for (Student obj : students) {

int id = obj.getId();
String studentName = obj.getName();
String studentgroup = obj.getGroup();

String textViewContents = String.valueOf(id) + "-" + studentName + " - " +


studentgroup;
TextView textViewStudentItem= new TextView(this);
textViewStudentItem.setPadding(0, 10, 0, 10);
textViewStudentItem.setText(textViewContents);
textViewStudentItem.setTag(Integer.toString(id));
linearLayoutRecords.addView(textViewStudentItem);
}

else {

TextView locationItem = new TextView(this);


locationItem.setPadding(8, 8, 8, 8);
locationItem.setText("Aucun enregistrement pour le moment.");
linearLayoutRecords.addView(locationItem);
}

appelez la méthode readRecords () dans onCreate ().

24
Nous allons maintenant créer de la même manière la méthode readRecords() dans la classe
OnClickListenerCreateStudent lorsque nous créons un nouvel étudiant afin d’actualiser le
contenu du ScrollView.

Ouvrez OnClickListenerCreateStudent et ajoutez la méthode readRecords comme ci-dessous:

25
public void readRecords(Context context,View view) {

LinearLayout linearLayoutRecords = (LinearLayout)


view.getRootView().findViewById(R.id.linearLayoutRecords);
linearLayoutRecords.removeAllViews();

List<Student> students = new StudentHandler(context).getAllStudents();

if (students.size() > 0) {

for (Student obj : students) {

int id = obj.getId();
String studentName = obj.getName();
String studentgroup = obj.getGroup();

String textViewContents = String.valueOf(id) + "-" + studentName + " - " +


studentgroup;
TextView textViewStudentItem= new TextView(context);
textViewStudentItem.setPadding(0, 10, 0, 10);
textViewStudentItem.setText(textViewContents);
textViewStudentItem.setTag(Integer.toString(id));
linearLayoutRecords.addView(textViewStudentItem);
}

else {

TextView locationItem = new TextView(context);


locationItem.setPadding(8, 8, 8, 8);
locationItem.setText("Aucun enregistrement pour le moment.");
linearLayoutRecords.addView(locationItem);
}

Appelez la fonction readRecords (context, view) dans la méthode onClick.

26
new AlertDialog.Builder(context)
.setView(formElementsView)
.setTitle("Cree un etudiant")
.setPositiveButton("Ajouter",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Student student=new Student();
String studentName = editTextStudentname.getText().toString();
String studentGroup =
editTextStudentGroup.getText().toString();

student.setName(studentName);
student.setGroup(studentGroup);

int createdStudent= new


StudentHandler(context).addStudent(student);

Toast.makeText(context, "L'etudiant a ete bien enregistre.",


Toast.LENGTH_SHORT).show();
countRecords(context,view);
readRecords(context,view);
dialog.cancel();
}

}).show();

27
28
Maintenant, lancez l'application et essayez de créer de nouveaux étudiants. La liste des
étudiants doit apparaître comme dans l'image ci-dessous:

Mise à jour d’un enregistrement dans la base de données SQLite


Créez une nouvelle classe OnLongClickListenerStudentRecord.java sous le package View. Nous
utiliserons un clic long pour donner à l’utilisateur une option de mise à jour.

29
Définissez OnLongClickListener pour chacun des enregistrements à afficher. Accédez à votre
méthode MainActivity.java è readRecords (), dans la boucle ‘for’, placez le code suivant sous
textViewStudentItem.setTag (Integer.toString (id));

Faites la même chose dans la classe OnClickListenerCreateStudent.

Pour tester le code ci-dessus, lancez l'application et appuyez longuement sur un étudiant
TextView. Le dialogue ci-dessous devrait apparaître:

30
Dans la méthode onClick() de l’AlertDialog , dans la méthode onLongClick (view) de la classe
OnLongClickListenerStudentRecord, insérez le code suivant. “Modifier” a un index de 0.

@Override
public boolean onLongClick(final View view) {
context = view.getContext();
id = view.getTag().toString();

final CharSequence[] items = { "Modifier", "Supprimer" };

new AlertDialog.Builder(context).setTitle("Dossier Etudiant")


.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
editRecord(Integer.parseInt(id),view);
}
dialog.dismiss();
}
}).show();

return false;
}

Nous voulons créer la méthode editRecord dans laquelle nous permettons à l'utilisateur de
modifier les informations d'un étudiant et d'effectuer une opération de mise à jour.

31
public void editRecord(final int studentId,final View view) {
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View formElementsView = inflater.inflate(R.layout.student_input_form, null,
false);

Student student = new StudentHandler(context).getStudent(studentId);

final EditText editTextStudentname = (EditText)


formElementsView.findViewById(R.id.editTextStudentname);
final EditText editTextStudentGroup = (EditText)
formElementsView.findViewById(R.id.editTextStudentGroup);

editTextStudentname.setText(student.getName());
editTextStudentGroup.setText(student.getGroup());

new AlertDialog.Builder(context)
.setView(formElementsView)
.setTitle("Mettre à jour les informations")
.setPositiveButton("Sauvegarder",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Student objectStudent = new Student();
objectStudent.setId(studentId);

objectStudent.setName(editTextStudentname.getText().toString());

objectStudent.setGroup(editTextStudentGroup.getText().toString());

int updatedStudent=new
StudentHandler(context).updateStudent(objectStudent);

Toast.makeText(context, "Le dossier de l'élève a été mis à


jour.", Toast.LENGTH_SHORT).show();
countRecords(context,view);
readRecords(context,view);
dialog.cancel();
}

}).show();

Enfin, ajoutez les méthodes countRecords et readRecords (les mêmes que celles créées dans la
classe OnClickListenerCreateStudent) à la classe OnLongClickListenerStudentRecord et appelez-
les dans la méthode editRecord afin de mettre à jour l'interface graphique après une opération
de mise à jour.

32
public void countRecords(Context context,View view) {
int studentCount = new StudentHandler(context).count();
TextView textViewRecordCount = (TextView)
view.getRootView().findViewById(R.id.textViewRecordCount);
textViewRecordCount.setText(studentCount + " enregistrements trouves.");
}

public void readRecords(Context context,View view) {

LinearLayout linearLayoutRecords = (LinearLayout)


view.getRootView().findViewById(R.id.linearLayoutRecords);
linearLayoutRecords.removeAllViews();

List<Student> students = new StudentHandler(context).getAllStudents();

if (students.size() > 0) {

for (Student obj : students) {

int id = obj.getId();
String studentName = obj.getName();
String studentgroup = obj.getGroup();

String textViewContents = String.valueOf(id) + "-" + studentName + " - " +


studentgroup;
TextView textViewStudentItem= new TextView(context);
textViewStudentItem.setPadding(0, 10, 0, 10);
textViewStudentItem.setText(textViewContents);
textViewStudentItem.setTag(Integer.toString(id));
textViewStudentItem.setOnLongClickListener(new
OnLongClickListenerStudentRecord());
linearLayoutRecords.addView(textViewStudentItem);
}

else {

TextView locationItem = new TextView(context);


locationItem.setPadding(8, 8, 8, 8);
locationItem.setText("Aucun enregistrement pour le moment.");
linearLayoutRecords.addView(locationItem);
}

33
34
Maintenant, testez votre application et assurez-vous que l'opération de mise à jour fonctionne
correctement.

35
Supprimer un enregistrement dans Android SQLite
Accédez à votre méthode OnLongClickListenerStudentRecord.java è onLongClick () è dans
la méthode AlertDialog onClick (). Mettez le code suivant après la première instruction if:

@Override
public boolean onLongClick(final View view) {
context = view.getContext();
id = view.getTag().toString();

final CharSequence[] items = { "Modifier", "Supprimer" };

new AlertDialog.Builder(context).setTitle("Dossier Etudiant")


.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) {
editRecord(Integer.parseInt(id),view);
}else if (item == 1) {
Student student = new Student();
student.setId(Integer.parseInt(id));
new StudentHandler(context).deleteStudent(student);
Toast.makeText(context, "Enregistrement supprimé avec succès",
Toast.LENGTH_SHORT).show();
countRecords(context,view);
readRecords(context,view);
}
dialog.dismiss();
}
}).show();

return false;
}

36
Lancez l'application et effectuez l'opération de suppression.

37

Vous aimerez peut-être aussi