In Android app development, data storage is a crucial aspect that determines how well an app can manage and retrieve data. One of the most commonly used databases for Android apps is SQLite. It is a lightweight, disk-based database that doesn’t require a separate server process, making it an ideal choice for mobile applications. In this section, we will delve into how to perform CRUD (Create, Read, Update, Delete) operations using SQLite in Kotlin for Android app development.

SQLite databases are embedded within the Android OS, allowing apps to store data persistently. This feature is particularly useful for apps that need to handle structured data, such as user profiles, settings, or any other form of tabular data. The SQLite database engine is small, fast, reliable, and self-contained, offering a robust solution for data storage on Android devices.

Setting Up SQLite in Kotlin

Before performing CRUD operations, you need to set up the SQLite database in your Android project. You can achieve this by creating a subclass of SQLiteOpenHelper. This class helps manage database creation and version management. Here’s how you can set it up:


class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

    companion object {
        private const val DATABASE_NAME = "example.db"
        private const val DATABASE_VERSION = 1
    }

    override fun onCreate(db: SQLiteDatabase) {
        val createTableSQL = """
            CREATE TABLE users (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                email TEXT NOT NULL
            )
        """
        db.execSQL(createTableSQL)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL("DROP TABLE IF EXISTS users")
        onCreate(db)
    }
}

In the above code, we define a table named users with three columns: id, name, and email. The onCreate method is called when the database is created for the first time, while onUpgrade handles database schema changes.

Performing CRUD Operations

Create Operation

To insert data into the database, you use the insert() method of the SQLiteDatabase class. Here’s how you can insert a new user into the users table:


fun addUser(name: String, email: String): Long {
    val db = this.writableDatabase
    val contentValues = ContentValues().apply {
        put("name", name)
        put("email", email)
    }
    return db.insert("users", null, contentValues).also {
        db.close()
    }
}

In this function, we create a ContentValues object to hold the data for the new row. The insert() method returns the row ID of the newly inserted row, or -1 if an error occurred.

Read Operation

To retrieve data from the database, you use the query() method. This method allows you to specify the columns you want to retrieve and the criteria for selecting rows. Here’s an example of how to read all users from the database:


fun getAllUsers(): List<User> {
    val db = this.readableDatabase
    val cursor = db.query(
        "users",
        arrayOf("id", "name", "email"),
        null, null, null, null, null
    )
    val users = mutableListOf<User>()
    with(cursor) {
        while (moveToNext()) {
            val user = User(
                getInt(getColumnIndexOrThrow("id")),
                getString(getColumnIndexOrThrow("name")),
                getString(getColumnIndexOrThrow("email"))
            )
            users.add(user)
        }
    }
    cursor.close()
    db.close()
    return users
}

In this example, we use a Cursor to iterate over the result set. The getColumnIndexOrThrow() method retrieves the index of a column, and we use it to extract the values for each user.

Update Operation

To update existing data in the database, you use the update() method. Here’s how you can update a user’s information:


fun updateUser(id: Int, name: String, email: String): Int {
    val db = this.writableDatabase
    val contentValues = ContentValues().apply {
        put("name", name)
        put("email", email)
    }
    val selection = "id = ?"
    val selectionArgs = arrayOf(id.toString())
    return db.update("users", contentValues, selection, selectionArgs).also {
        db.close()
    }
}

The update() method returns the number of rows affected. In this function, we specify the row to update using a WHERE clause, represented by the selection and selectionArgs parameters.

Delete Operation

To delete data from the database, you use the delete() method. Here’s how you can delete a user by their ID:


fun deleteUser(id: Int): Int {
    val db = this.writableDatabase
    val selection = "id = ?"
    val selectionArgs = arrayOf(id.toString())
    return db.delete("users", selection, selectionArgs).also {
        db.close()
    }
}

The delete() method returns the number of rows deleted. Similar to the update operation, we specify the row to delete using a WHERE clause.

Best Practices

When working with SQLite databases in Android, consider the following best practices:

  • Use Transactions: For operations that modify the database, such as insert, update, or delete, use transactions to ensure data integrity. Begin a transaction with db.beginTransaction(), mark it as successful with db.setTransactionSuccessful(), and end it with db.endTransaction().
  • Close Resources: Always close the database and cursor objects to free up resources and prevent memory leaks.
  • Use Content Providers: If your app needs to share data with other apps, consider using a Content Provider to manage data access.
  • Optimize Queries: Use indices for columns that are frequently queried to improve performance. Analyze your query patterns to determine which columns should be indexed.

SQLite databases offer a powerful way to manage structured data within Android apps. By understanding and implementing CRUD operations, you can effectively store, retrieve, and manipulate data, enhancing the functionality and user experience of your applications. With Kotlin’s concise syntax and Android’s robust SQLite support, you have all the tools you need to build data-driven apps efficiently.

Now answer the exercise about the content:

Which of the following is a best practice when working with SQLite databases in Android app development?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Working with SQLite Databases: Using ContentValues in SQLite

Next page of the Free Ebook:

34Working with SQLite Databases: Using ContentValues in SQLite

9 minutes

Obtenez votre certificat pour ce cours gratuitement ! en téléchargeant lapplication Cursa et en lisant lebook qui sy trouve. Disponible sur Google Play ou App Store !

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text