Vous êtes sur la page 1sur 18

INTRODUCTION

La persistance des données, qui consiste à stocker ou à conserver les données sur
l'appareil, joue un rôle essentiel dans le développement d'Android. Les données persistantes
permettent de s'assurer que le contenu généré par l'utilisateur n'est pas perdu lorsque
l'application est fermée ou que les données téléchargées depuis Internet sont enregistrées pour
ne pas avoir à les télécharger à nouveau par la suite.

SQLite, qui est fourni par le SDK Android, est couramment utilisé par les applications
Android afin d'assurer la persistance des données. Avec sa base de données relationnelle, il
vous permet de représenter les données comme si vous les organisiez avec des classes Kotlin.

I. QU'EST-CE QUE SQLITE ?

SQLite est une base de données relationnelle couramment utilisée. Plus précisément,
SQLite désigne une bibliothèque C légère permettant de gérer des bases de données
relationnelles avec le langage Structured Query Language, plus connu sous le nom de SQL.

SQLite est une base de données relationnelle open source utilisée pour effectuer des
opérations de base de données sur des appareils Android, telles que le stockage, la manipulation
ou la récupération de données persistantes à partir de la base de données.

Par défaut, la base de données SQLite est intégrée à Android. Il n’est donc pas
nécessaire d’effectuer une tâche de configuration ou d’administration de base de données.

La classe SQLiteOpenHelper fournit la fonctionnalité permettant d'utiliser la base de


données SQLite .

II. Classe SQLiteOpenHelper

La classe android.database.sqlite.SQLiteOpenHelper est utilisée pour la création de


bases de données et la gestion des versions. Pour effectuer toute opération de base de données,
vous devez fournir l’implémentation des méthodes onCreate() et onUpgrade() de la classe
SQLiteOpenHelper.

A.Constructeurs de la classe SQLiteOpenHelper

1
Il existe deux constructeurs de classe SQLiteOpenHelper.

Constructeur Description

SQLiteOpenHelper(context: Context, name: String, Crée un objet SQLiteOpenHelper pour


factory: SQLiteDatabase.CursorFactory, version: Int) créer, ouvrir et gérer la base de données.

SQLiteOpenHelper(context: Context, name: String, Crée un objet SQLiteOpenHelper pour


factory: SQLiteDatabase.CursorFactory, version: Int, créer, ouvrir et gérer la base de données. Il
errorHandler: DatabaseErrorHandler) spécifie le gestionnaire d'erreurs.

B. Méthodes de la classe SQLiteOpenHelper

Plusieurs méthodes sont disponibles dans la classe SQLiteOpenHelper. Certains d’entre


eux sont mentionnés ci-dessous :

Méthode Description

public abstract void onCreate(SQLiteDatabase db) Appelé une seule fois lors de la première
création de la base de données.

public abstract void onUpgrade(SQLiteDatabase db, int Appelé lorsque la base de données doit être
oldVersion, int newVersion) mise à niveau.

public synchronized void close () Ferme l'objet de base de données.

public void onDowngrade(SQLiteDatabase db, int appelé lorsque la base de données doit être
oldVersion, int newVersion) rétrogradée.

C. Classe SQLiteDatabase

Il contient des méthodes à exécuter sur la base de données SQLite telles que créer, mettre
à jour, supprimer, sélectionner, etc.

1. Méthodes de la classe SQLiteDatabase

2
Il existe de nombreuses méthodes dans la classe SQLiteDatabase. Certains d’entre eux
sont les suivants :

Méthode Description

execSQL(String sql): Unit Exécute la requête SQL, pas une requête de sélection.

insert(String table, String Insère un enregistrement dans la base de données. La table spécifie
nullColumnHack, ContentValues le nom de la table, nullColumnHack n'autorise pas les valeurs
values): Long complètement nulles. Si le deuxième argument est nul, Android
stockera les valeurs nulles si les valeurs sont vides. Le troisième
argument spécifie les valeurs à stocker.

insert(String table, String Met à jour une ligne.


nullColumnHack, ContentValues
values): Long

query(String table, String[] columns, Renvoie un curseur sur l'ensemble de résultats.


String selection, String[]
selectionArgs, String groupBy, String
having, String orderBy): Cursor

III. DATA CLASSE

Une base de données relationnelle fonctionne de la manière suivante :

 Les tables définissent des regroupements généraux de données que vous souhaitez
représenter, par exemple les étudiants et les professeurs.
 Les colonnes définissent les données que chaque ligne de la table comporte.
 Les lignes contiennent des données réelles, qui sont des valeurs correspondant à chaque
colonne de la table.

La structure d'une base de données relationnelle reflète également ce que vous savez
déjà sur les classes et les objets en Kotlin.

3
data class Student(
id: Int,
name: String,
major: String,
gpa: Double
)

 Les classes, comme les tables, modélisent les données que vous souhaitez représenter
dans votre application.
 Comme les colonnes, les propriétés définissent les données spécifiques que chaque
instance de la classe doit contenir.
 Les objets, comme les lignes, sont les données réelles. Ils contiennent des valeurs pour
chaque propriété définie dans la classe, tout comme les lignes comportent les valeurs de
chaque colonne définie dans la table de données.

IV. Exemple CRUD de base de données Kotlin Android


SQLite

Dans cet exemple, nous effectuerons des opérations de création, de lecture, de mise à
jour et de suppression sur la base de données Android SQLite.

1. activité_main.xml

Dans le fichier Activity_main.xml , ajoutez le code suivant. Dans ce fichier, nous avons
ajouté trois EditText, un ListView, quatre boutons pour les opérations d'enregistrement,
d'affichage, de mise à jour et de suppression.

1. <?xml version="1.0" encoding="utf-8"?>


2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. xmlns:app="http://schemas.android.com/apk/res-auto"
4. xmlns:tools="http://schemas.android.com/tools"
5. android:layout_width="match_parent"
6. android:layout_height="match_parent"
7. android:layout_marginBottom="8dp"
8. android:layout_marginEnd="8dp"
9. android:layout_marginStart="8dp"

4
10. android:layout_marginTop="8dp"
11. android:orientation="vertical"
12. tools:context="example.javatpoint.com.kotlinsqlitecrud.MainActivity">
13.
14. <TableLayout
15. android:layout_width="match_parent"
16. android:layout_height="wrap_content">
17.
18. <TableRow>
19. <TextView
20. android:text="User Id"
21. android:layout_width="wrap_content"
22. android:layout_height="wrap_content"
23. android:layout_column="1" />
24.
25. <EditText
26.
27. android:id="@+id/u_id"
28. android:layout_width="200dp"
29. android:layout_height="wrap_content"
30. android:layout_marginLeft="20sp"
31. android:layout_marginStart="20sp"
32. android:width="150px" />
33. </TableRow>
34. <TableRow>
35. <TextView
36. android:text="User Name"
37. android:layout_width="wrap_content"
38. android:layout_height="wrap_content"
39. android:layout_column="1" />
40.
41. <EditText
42. android:id="@+id/u_name"
43. android:width="200dp"
44. android:layout_width="wrap_content"
45. android:layout_height="wrap_content"
46. android:layout_column="2"

5
47. android:layout_marginStart="20sp"
48. android:layout_marginLeft="20sp"/>
49. </TableRow>
50.
51. <TableRow>
52.
53. <TextView
54. android:text="User Email"
55. android:layout_width="wrap_content"
56. android:layout_height="wrap_content"
57. android:layout_column="1" />
58.
59. <EditText
60. android:id="@+id/u_email"
61. android:width="200dp"
62. android:layout_width="wrap_content"
63. android:layout_height="wrap_content"
64. android:layout_column="2"
65. android:layout_marginStart="20sp"
66. android:layout_marginLeft="20sp" />
67. </TableRow>
68.
69. </TableLayout>
70. <LinearLayout
71. android:layout_width="wrap_content"
72. android:layout_height="350sp"
73. android:layout_marginTop="20sp">
74. <ListView
75. android:id="@+id/listView"
76. android:layout_width="wrap_content"
77. android:layout_height="350sp"/>
78. </LinearLayout>
79. <LinearLayout
80. android:layout_width="wrap_content"
81. android:layout_height="wrap_content"
82. android:layout_marginTop="40sp"
83. android:orientation="horizontal"

6
84. android:layout_gravity="center">
85. <Button
86. android:layout_width="wrap_content"
87. android:layout_height="wrap_content"
88. android:text="Save"
89. android:onClick="saveRecord"/>
90. <Button
91. android:layout_width="wrap_content"
92. android:layout_height="wrap_content"
93. android:text="View"
94. android:onClick="viewRecord"/>
95. <Button
96. android:layout_width="wrap_content"
97. android:layout_height="wrap_content"
98. android:text="Update"
android:onClick="updateRecord"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="deleteRecord"/>
</LinearLayout>
</LinearLayout>

2. MainActivity.kt

Ajoutez le code suivant dans la classe MainActivity.kt . Dans cette classe, la fonction
saveRecord() enregistre les enregistrements. La fonction viewRecord() lit l'enregistrement et
les affiche dans ListView, la fonction updateRecord() met à jour l'enregistrement en fonction
de l'identifiant et la fonction deleteRecord() supprime l'enregistrement. Le val
databaseHandler : DatabaseHandler= DatabaseHandler(this) crée l’instance de la
classe DatabaseHandler qui appelle la logique de base de données SQLite.

1. package example.javatpoint.com.kotlinsqlitecrud
2.

7
3. import android.support.v7.app.AppCompatActivity
4. import android.os.Bundle
5. import android.view.View
6. import android.widget.EditText
7. import android.widget.Toast
8. import kotlinx.android.synthetic.main.activity_main.*
9. import android.content.DialogInterface
import android.support.v7.app.AlertDialog
1. class MainActivity : AppCompatActivity() {
2. override fun onCreate(savedInstanceState: Bundle?) {
3. super.onCreate(savedInstanceState)
4. setContentView(R.layout.activity_main)
5. }
6. //method for saving records in database
7. fun saveRecord(view: View){
8. val id = u_id.text.toString()
9. val name = u_name.text.toString()
val email = u_email.text.toString()
val databaseHandler: DatabaseHandler= DatabaseHandler(this)
if(id.trim()!="" && name.trim()!="" && email.trim()!=""){
val status = databaseHandler.addEmployee(EmpModelClass(Integer.parseInt(id),name, email))
if(status > -1){
Toast.makeText(applicationContext,"record save",Toast.LENGTH_LONG).show()
u_id.text.clear()
u_name.text.clear()
u_email.text.clear()
}
}else{
Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LONG)
.show()
}

}
1. fun viewRecord(view: View){
2. //creating the instance of DatabaseHandler class
3. val databaseHandler: DatabaseHandler= DatabaseHandler(this)
4. //calling the viewEmployee method of DatabaseHandler class to read the records

8
5. val emp: List<EmpModelClass> = databaseHandler.viewEmployee()
6. val empArrayId = Array<String>(emp.size){"0"}
7. val empArrayName = Array<String>(emp.size){"null"}
8. val empArrayEmail = Array<String>(emp.size){"null"}
9. var index = 0
10. for(e in emp){
11. empArrayId[index] = e.userId.toString()
12. empArrayName[index] = e.userName
13. empArrayEmail[index] = e.userEmail
14. index++
15. }
16. //creating custom ArrayAdapter
17. val myListAdapter = MyListAdapter(this,empArrayId,empArrayName,empArrayEmail)
18. listView.adapter = myListAdapter
19. }
20. //method for updating records based on user id
21. fun updateRecord(view: View){
22. val dialogBuilder = AlertDialog.Builder(this)
23. val inflater = this.layoutInflater
24. val dialogView = inflater.inflate(R.layout.update_dialog, null)
25. dialogBuilder.setView(dialogView)
26.
27. val edtId = dialogView.findViewById(R.id.updateId) as EditText
28. val edtName = dialogView.findViewById(R.id.updateName) as EditText
29. val edtEmail = dialogView.findViewById(R.id.updateEmail) as EditText
30.
31. dialogBuilder.setTitle("Update Record")
32. dialogBuilder.setMessage("Enter data below")
33. dialogBuilder.setPositiveButton("Update", DialogInterface.OnClickListener { _, _ ->
34.
35. val updateId = edtId.text.toString()
36. val updateName = edtName.text.toString()
37. val updateEmail = edtEmail.text.toString()
38. //creating the instance of DatabaseHandler class
39. val databaseHandler: DatabaseHandler= DatabaseHandler(this)
40. if(updateId.trim()!="" && updateName.trim()!="" && updateEmail.trim()!=""){
41. //calling the updateEmployee method of DatabaseHandler class to update record

9
42. val status = databaseHandler.updateEmployee(EmpModelClass(Integer.parseInt(updateId),up
dateName, updateEmail))
43. if(status > -1){
44. Toast.makeText(applicationContext,"record update",Toast.LENGTH_LONG).show()
45. }
46. }else{
47. Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LON
G).show()
48. }
49.
50. })
51. dialogBuilder.setNegativeButton("Cancel", DialogInterface.OnClickListener { dialog, which ->
52. //pass
53. })
54. val b = dialogBuilder.create()
55. b.show()
56. }
57. //method for deleting records based on id
58. fun deleteRecord(view: View){
59. //creating AlertDialog for taking user id
60. val dialogBuilder = AlertDialog.Builder(this)
61. val inflater = this.layoutInflater
62. val dialogView = inflater.inflate(R.layout.delete_dialog, null)
63. dialogBuilder.setView(dialogView)
64.
65. val dltId = dialogView.findViewById(R.id.deleteId) as EditText
66. dialogBuilder.setTitle("Delete Record")
67. dialogBuilder.setMessage("Enter id below")
68. dialogBuilder.setPositiveButton("Delete", DialogInterface.OnClickListener { _, _ ->
69.
70. val deleteId = dltId.text.toString()
71. //creating the instance of DatabaseHandler class
72. val databaseHandler: DatabaseHandler= DatabaseHandler(this)
73. if(deleteId.trim()!=""){
74. //calling the deleteEmployee method of DatabaseHandler class to delete record
75. val status = databaseHandler.deleteEmployee(EmpModelClass(Integer.parseInt(deleteId),"",""))
76. if(status > -1){

10
77. Toast.makeText(applicationContext,"record deleted",Toast.LENGTH_LONG).show()
78. }
79. }else{
80. Toast.makeText(applicationContext,"id or name or email cannot be blank",Toast.LENGTH_LON
G).show()
}

})
dialogBuilder.setNegativeButton("Cancel", DialogInterface.OnClickListener { _, _ ->
//pass
})
val b = dialogBuilder.create()
b.show()
}
}

3. EmpModelClass.kt

Création d'une classe de modèle de données nommée EmpModelClass.kt

1. package example.javatpoint.com.kotlinsqlitecrud
2. //creating a Data Model Class
3. class EmpModelClass (var userId: Int, val userName:String , val userEmail: String)

4. liste_personnalisée.xml

Créez une disposition de lignes personnalisée pour afficher les éléments de la liste dans
ListView.

1. <?xml version="1.0" encoding="utf-8"?>


2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical" android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:id="@+id/linearLayout">

11
6.
7. <TextView
8. android:id="@+id/textViewId"
9. android:layout_width="match_parent"
10. android:layout_height="wrap_content"
11. android:text="Id"
12. android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/
>
13.
<TextView
android:id="@+id/textViewName"
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:text="Name"
17. android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/
>
18.
19. <TextView
20. android:id="@+id/textViewEmail"
21. android:layout_width="match_parent"
22. android:layout_height="wrap_content"
23. android:text="Email"
24. android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/
>
25. </LinearLayout>

5. MaListeAdaptateur.kt

Maintenant, créez une classe d'adaptateur personnalisée nommée MyListAdapter.kt et


étendez la classe ArrayAdapter qui remplit le modèle de données dans ListView.

1. package example.javatpoint.com.kotlinsqlitecrud

2. import android.app.Activity
3. import android.view.View

12
4. import android.view.ViewGroup
5. import android.widget.ArrayAdapter
6. import android.widget.TextView
7.
8. class MyListAdapter(private val context: Activity, private val id: Array<String>, private val
name: Array<String>, private val email: Array<String>)
9. : ArrayAdapter<String>(context, R.layout.custom_list, name) {
10.
11. override fun getView(position: Int, view: View?, parent: ViewGroup): View {
12. val inflater = context.layoutInflater
13. val rowView = inflater.inflate(R.layout.custom_list, null, true)
14.
15. val idText = rowView.findViewById(R.id.textViewId) as TextView
16. val nameText = rowView.findViewById(R.id.textViewName) as TextView
17. val emailText = rowView.findViewById(R.id.textViewEmail) as TextView
18.
19. idText.text = "Id: ${id[position]}"
20. nameText.text = "Name: ${name[position]}"
21. emailText.text = "Email: ${email[position]}"
22. return rowView
23. }
24. }

6. update_dialog.xml
Créez une mise en page pour afficher AlertDialog pour l’enregistrement de mise à jour.

1. <?xml version="1.0" encoding="utf-8"?>


2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:padding="10dp"
5. android:layout_width="match_parent"
6. android:layout_height="match_parent">
7.
8. <EditText
9. android:id="@+id/updateId"

13
10. android:layout_width="match_parent"
11. android:layout_height="wrap_content"
12. android:ems="10"
13. android:hint="enter id" />
14.
15. <EditText
16. android:id="@+id/updateName"
17. android:layout_width="match_parent"
18. android:layout_height="wrap_content"
19. android:ems="10"
20. android:hint="enter name"/>
21.
22. <EditText
23. android:id="@+id/updateEmail"
24. android:layout_width="match_parent"
25. android:layout_height="wrap_content"
26. android:ems="10"
27. android:hint="enter email"/>
28. </LinearLayout>

7. delete_dialog.xml
Créez une mise en page pour afficher AlertDialog pour supprimer l'enregistrement.

1. <?xml version="1.0" encoding="utf-8"?>


2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:padding="10dp"
5. android:layout_width="match_parent"
6. android:layout_height="match_parent">
7.
8. <EditText
9. android:id="@+id/deleteId"
10. android:layout_width="match_parent"
11. android:layout_height="wrap_content"

14
12. android:ems="10"
13. android:hint="enter id" />
14. </LinearLayout>

8. DatabaseHandler.kt
Créez la classe DatabaseHandler.kt qui étend la classe SQLiteOpenHelper et
remplacez ses fonctions onCreate(), onUpgrage() . Insérez des données dans la base de
données en passant un objet ContentValues à la méthode insert() .

1. package example.javatpoint.com.kotlinsqlitecrud
2.
3. import android.content.Context
4. import android.database.sqlite.SQLiteDatabase
5. import android.database.sqlite.SQLiteOpenHelper
6. import android.content.ContentValues
7. import android.database.Cursor
8. import android.database.sqlite.SQLiteException
9.
10. //creating the database logic, extending the SQLiteOpenHelper base class
11. class DatabaseHandler(context: Context): SQLiteOpenHelper(context,DATABASE_N
AME,null,DATABASE_VERSION) {
12. companion object {
13. private val DATABASE_VERSION = 1
14. private val DATABASE_NAME = "EmployeeDatabase"
15. private val TABLE_CONTACTS = "EmployeeTable"
16. private val KEY_ID = "id"
17. private val KEY_NAME = "name"
18. private val KEY_EMAIL = "email"
19. }
20. override fun onCreate(db: SQLiteDatabase?) {
21. // TODO("not implemented") //To change body of created functions use File | S
ettings | File Templates.
22. //creating table with fields
23. val CREATE_CONTACTS_TABLE = ("CREATE TABLE " + TABLE_CONTACTS + "("
24. + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"

15
25. + KEY_EMAIL + " TEXT" + ")")
26. db?.execSQL(CREATE_CONTACTS_TABLE)
27. }
28.
29. override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
30. // TODO("not implemented") //To change body of created functions use File | S
ettings | File Templates.
31. db!!.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS)
32. onCreate(db)
33. }
34.
35.
36. //method to insert data
37. fun addEmployee(emp: EmpModelClass):Long{
38. val db = this.writableDatabase
39. val contentValues = ContentValues()
40. contentValues.put(KEY_ID, emp.userId)
41. contentValues.put(KEY_NAME, emp.userName) // EmpModelClass Name
42. contentValues.put(KEY_EMAIL,emp.userEmail ) // EmpModelClass Phone
43. // Inserting Row
44. val success = db.insert(TABLE_CONTACTS, null, contentValues)
45. //2nd argument is String containing nullColumnHack
46. db.close() // Closing database connection
47. return success
48. }
49. //method to read data
50. fun viewEmployee():List<EmpModelClass>{
51. val empList:ArrayList<EmpModelClass> = ArrayList<EmpModelClass>()
52. val selectQuery = "SELECT * FROM $TABLE_CONTACTS"
53. val db = this.readableDatabase
54. var cursor: Cursor? = null
55. try{
56. cursor = db.rawQuery(selectQuery, null)
57. }catch (e: SQLiteException) {
58. db.execSQL(selectQuery)
59. return ArrayList()
60. }

16
61. var userId: Int
62. var userName: String
63. var userEmail: String
64. if (cursor.moveToFirst()) {
65. do {
66. userId = cursor.getInt(cursor.getColumnIndex("id"))
67. userName = cursor.getString(cursor.getColumnIndex("name"))
68. userEmail = cursor.getString(cursor.getColumnIndex("email"))
69. val emp= EmpModelClass(userId = userId, userName = userName, userE
mail = userEmail)
70. empList.add(emp)
71. } while (cursor.moveToNext())
72. }
73. return empList
74. }
75. //method to update data
76. fun updateEmployee(emp: EmpModelClass):Int{
77. val db = this.writableDatabase
78. val contentValues = ContentValues()
79. contentValues.put(KEY_ID, emp.userId)
80. contentValues.put(KEY_NAME, emp.userName) // EmpModelClass Name
81. contentValues.put(KEY_EMAIL,emp.userEmail ) // EmpModelClass Email
82.
83. // Updating Row
84. val success = db.update(TABLE_CONTACTS, contentValues,"id="+emp.userId,n
ull)
85. //2nd argument is String containing nullColumnHack
86. db.close() // Closing database connection
87. return success
88. }
89. //method to delete data
90. fun deleteEmployee(emp: EmpModelClass):Int{
91. val db = this.writableDatabase
92. val contentValues = ContentValues()
93. contentValues.put(KEY_ID, emp.userId) // EmpModelClass UserId
94. // Deleting Row
val success = db.delete(TABLE_CONTACTS,"id="+emp.userId,null)

17
//2nd argument is String containing nullColumnHack
db.close() // Closing database connection
return success
}
}

18

Vous aimerez peut-être aussi