Académique Documents
Professionnel Documents
Culture Documents
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.
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.
1
Il existe deux constructeurs de classe SQLiteOpenHelper.
Constructeur Description
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 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.
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.
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.
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.
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
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.
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
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.
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.
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