Room Database in Kotlin

What is Room?

Room is part of the Android Architecture Components presented in the Google I/O 2016. It is not an ORM, it is a whole library that allows us to create and manipulate SQLite databases easier, by using annotations we can define our databases, its tables, and operations.

Room will automatically translate these annotations into SQLite instructions/queries to perform the correspondent operations into the DB engine.

Room architecture looks like follow:

Room Database in Kotlin 1

The three major components of Room are:

  • Database: It represents the DB, it is an object that holds a connection to the SQLite DB and all the operations are executed through it. It is annotated with @Database.
  • Entity: Represents a table within the Room Database. It should be annotated with @Entity.
  • DAO: An interface that contains the methods to access the Database. It is annotated with @Dao .

Here is an example Room Database in Kotlin

STEP – 1 Add Dependency in app level buid.gradle file

dependencies {
  def room_version = "2.2.5"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt 


}

Also we need to add plugin in build.gradle file

apply plugin: 'kotlin-kapt'

Now we want to create a table in which we can store users so we have to do following steps

STEP- 2 Create a kotlin data class

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

Already mentioned entity is a table in Room database so we want to create a table with table name User (table name will be same as data class name) and will have 3 fields- uid (which will be Primary key), first_name and last_name.

STEP – 3 Create an interface in kotlin

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

@Dao represent the database methods to be used, we use @Insert for inserting data, @delete for deleting data, and @Query to query data.

STEP – 4 Create a database

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

STEP – 5 Call this database in your MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

       thread{
       val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()  // 1
         
       db.userDao().insertAll(User(1, "Jayant", "Dhingra")) // 2
        }

}
}

Understanding MainActivity

Part 1 => We are creating a Room database builder class then passing the application context , databse class and database name.

Part 2 => We are calling insertAll method from user Dao.

Thats all Folks!!

We Recommend

Don't Miss Out!

Get the very best of Android Hire in your inbox. News, How To,  Apps and games & Tutorials.