Room Room

An app with implementation of Room database for Android platform

The Room persistence library provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite. In particular, Room provides the following benefits:

  • Compile-time verification of SQL queries.
  • Convenience annotations that minimize repetitive and error-prone boilerplate code.
  • Streamlined database migration paths.

To persist data with Room database you just need:

1. Add Room dependencies (build.gradle)

plugins {  
  id 'kotlin-android-extensions'  
  id 'kotlin-kapt'  

dependencies {  
  def roomVersion = "2.4.1"  
  implementation "$roomVersion"  
  kapt "$roomVersion"

2. Create your Entity

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

3. Declare your data access object

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(onConflict = OnConflictStrategy.REPLACE)  
    fun insertAll(vararg users: User)  
    fun updateUser(user: User)  
	fun delete(user: User)  

We use a singleton pattern to call our database when needed. Since we are not using LiveData or Coroutines scopes, we need to use .allowMainThreadQueries(). Keep in mind that this approach is not the best answer

4. App database singleton

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

	companion object {  
        private var INSTANCE: AppDatabase? = null
		fun getDatabase(context: Context): AppDatabase {  
			if (INSTANCE == null) {
					synchronized(this) {  
						INSTANCE = Room.databaseBuilder(  
	                        context,, "user_database")  
            return INSTANCE!!  

Everything is ready, now just call our singleton and start to use

5. Start your queries

val db = AppDatabase.getDatabase(requireContext())  
val userDao = db.userDao()

val myUser = (null, "Void", "Hash")

A piece of cake! Now, have fun!


View Github