Skip to content

Commit

Permalink
Add room library. Create Entity+Dao+Database
Browse files Browse the repository at this point in the history
  • Loading branch information
Serchinastico committed Mar 15, 2019
1 parent f34030c commit 6ebd9f7
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.karumi.jetpack.superheroes

import android.app.Application
import androidx.room.Room
import com.karumi.jetpack.superheroes.common.SuperHeroesDatabase
import com.karumi.jetpack.superheroes.common.module
import com.karumi.jetpack.superheroes.data.repository.LocalSuperHeroDataSource
import com.karumi.jetpack.superheroes.data.repository.RemoteSuperHeroDataSource
import com.karumi.jetpack.superheroes.data.repository.SuperHeroRepository
import com.karumi.jetpack.superheroes.data.repository.room.SuperHeroDao
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.android.androidModule
Expand All @@ -30,11 +33,23 @@ class SuperHeroesApplication : Application(), KodeinAware {
}

private fun appDependencies(): Kodein.Module = module {
bind<SuperHeroesDatabase>() with singleton {
Room.databaseBuilder(
this@SuperHeroesApplication,
SuperHeroesDatabase::class.java,
"superheroes-db"
).fallbackToDestructiveMigration()
.build()
}
bind<SuperHeroDao>() with provider {
val database: SuperHeroesDatabase = instance()
database.superHeroesDao()
}
bind<SuperHeroRepository>() with provider {
SuperHeroRepository(instance(), instance())
}
bind<LocalSuperHeroDataSource>() with singleton {
LocalSuperHeroDataSource()
LocalSuperHeroDataSource(instance())
}
bind<RemoteSuperHeroDataSource>() with provider {
RemoteSuperHeroDataSource()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.karumi.jetpack.superheroes.common

import androidx.room.Database
import androidx.room.RoomDatabase
import com.karumi.jetpack.superheroes.data.repository.room.SuperHeroDao
import com.karumi.jetpack.superheroes.data.repository.room.SuperHeroEntity

@Database(entities = [SuperHeroEntity::class], version = 1)
abstract class SuperHeroesDatabase : RoomDatabase() {
abstract fun superHeroesDao(): SuperHeroDao
}
Original file line number Diff line number Diff line change
@@ -1,37 +1,32 @@
package com.karumi.jetpack.superheroes.data.repository

import com.karumi.jetpack.superheroes.data.repository.room.SuperHeroDao
import com.karumi.jetpack.superheroes.data.repository.room.SuperHeroEntity
import com.karumi.jetpack.superheroes.domain.model.SuperHero

class LocalSuperHeroDataSource {
companion object {
private const val BIT_TIME = 250L
}

private val superHeroes: MutableMap<String, SuperHero> = mutableMapOf()
class LocalSuperHeroDataSource(
private val dao: SuperHeroDao
) {
fun getAllSuperHeroes(): List<SuperHero> =
dao.getAll()
.map { it.toSuperHero() }

fun getAllSuperHeroes(): List<SuperHero> {
waitABit()
return superHeroes.values.toList()
}

fun get(id: String): SuperHero? {
waitABit()
return superHeroes[id]
}
fun get(id: String): SuperHero? =
dao.getById(id)?.toSuperHero()

fun saveAll(all: List<SuperHero>) {
waitABit()
superHeroes.clear()
superHeroes.putAll(all.associateBy { it.id })
dao.deleteAll()
dao.insertAll(all.map { it.toEntity() })
}

fun save(superHero: SuperHero): SuperHero {
waitABit()
superHeroes[superHero.id] = superHero
dao.insertAll(listOf(superHero.toEntity()))
return superHero
}

private fun waitABit() {
Thread.sleep(BIT_TIME)
}
private fun SuperHeroEntity.toSuperHero(): SuperHero =
SuperHero(id, name, photo, isAvenger, description)

private fun SuperHero.toEntity(): SuperHeroEntity =
SuperHeroEntity(id, name, photo, isAvenger, description)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.karumi.jetpack.superheroes.data.repository.room

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query

@Dao
interface SuperHeroDao {
@Query("SELECT * FROM superheroes ORDER BY id ASC")
fun getAll(): List<SuperHeroEntity>

@Query("SELECT * FROM superheroes WHERE id = :id")
fun getById(id: String): SuperHeroEntity?

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(superHeroes: List<SuperHeroEntity>)

@Query("DELETE FROM superheroes")
fun deleteAll()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.karumi.jetpack.superheroes.data.repository.room

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "superheroes")
data class SuperHeroEntity(
@PrimaryKey val id: String,
val name: String,
val photo: String?,
val isAvenger: Boolean,
val description: String
)

0 comments on commit 6ebd9f7

Please sign in to comment.