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 af3546b commit dfcf6b8
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "3298ad790ab4e90668532dfc9d342b54",
"entities": [
{
"tableName": "superheroes",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `photo` TEXT, `isAvenger` INTEGER NOT NULL, `description` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "photo",
"columnName": "photo",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isAvenger",
"columnName": "isAvenger",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"3298ad790ab4e90668532dfc9d342b54\")"
]
}
}
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.DKodein
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
Expand All @@ -31,11 +34,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(instance())
LocalSuperHeroDataSource(instance(), instance())
}
bind<RemoteSuperHeroDataSource>() with provider {
RemoteSuperHeroDataSource(instance())
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,42 +1,34 @@
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
import java.util.concurrent.ExecutorService

class LocalSuperHeroDataSource(
private val dao: SuperHeroDao,
private val executor: ExecutorService
) {
companion object {
private const val BIT_TIME = 250L
}

private val superHeroes: MutableMap<String, SuperHero> = mutableMapOf()
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>) = executor.execute {
waitABit()
superHeroes.clear()
superHeroes.putAll(all.associateBy { it.id })
dao.deleteAll()
dao.insertAll(all.map { it.toEntity() })
}

fun save(superHero: SuperHero): SuperHero {
executor.execute {
waitABit()
superHeroes[superHero.id] = superHero
}
executor.execute { 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 dfcf6b8

Please sign in to comment.