Skip to content

Commit

Permalink
- add room database injection
Browse files Browse the repository at this point in the history
  • Loading branch information
10zgurr committed Nov 18, 2019
1 parent 7937b7a commit bd800e7
Show file tree
Hide file tree
Showing 15 changed files with 153 additions and 131 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.sample.libraryapplication

import android.app.Application
import com.sample.libraryapplication.dagger.components.DaggerLibraryComponent
import com.sample.libraryapplication.dagger.components.LibraryComponent
import com.sample.libraryapplication.dagger.modules.AppModule
import com.sample.libraryapplication.dagger.component.DaggerLibraryComponent
import com.sample.libraryapplication.dagger.component.LibraryComponent
import com.sample.libraryapplication.dagger.module.RoomDatabaseModule

class LibraryApplication : Application() {

Expand All @@ -18,7 +18,7 @@ class LibraryApplication : Application() {

libraryComponent = DaggerLibraryComponent
.builder()
.appModule(AppModule(this))
.roomDatabaseModule(RoomDatabaseModule(this))
.build()
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.sample.libraryapplication.dagger.components
package com.sample.libraryapplication.dagger.component

import com.sample.libraryapplication.dagger.modules.AppModule
import com.sample.libraryapplication.dagger.modules.LibraryModule
import com.sample.libraryapplication.dagger.module.LibraryModule
import com.sample.libraryapplication.dagger.module.RoomDatabaseModule
import com.sample.libraryapplication.view.BookActivity
import com.sample.libraryapplication.view.BookListActivity
import dagger.Component
import javax.inject.Singleton

@Singleton
@Component(modules = [AppModule::class, LibraryModule::class])
@Component(modules = [RoomDatabaseModule::class, LibraryModule::class])
interface LibraryComponent {
fun inject(bookActivity: BookActivity)
fun inject(bookListActivity: BookListActivity)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sample.libraryapplication.dagger.builders
package com.sample.libraryapplication.dagger.factory

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sample.libraryapplication.dagger.builders
package com.sample.libraryapplication.dagger.factory

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sample.libraryapplication.dagger.module

import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.repository.BookRepository
import com.sample.libraryapplication.repository.CategoryRepository
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class LibraryModule {

@Singleton
@Provides
fun providesBookRepository(libraryDatabase: LibraryDatabase): BookRepository {
return BookRepository(libraryDatabase)
}

@Singleton
@Provides
fun providesCategoryRepository(libraryDatabase: LibraryDatabase): CategoryRepository {
return CategoryRepository(libraryDatabase)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.sample.libraryapplication.dagger.module

import android.app.Application
import android.util.Log
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import javax.inject.Singleton

@Module
class RoomDatabaseModule(application: Application) {

private var libraryApplication = application
private lateinit var libraryDatabase: LibraryDatabase

companion object {
private const val EDUCATIONAL_BOOKS_CATEGORY_ID = 1L
private const val NOVELS_CATEGORY_ID = 2L
private const val OTHER_BOOKS_CATEGORY_ID = 3L
}

private val databaseCallback = object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
Log.d("RoomDatabaseModule", "onCreate")
CoroutineScope(Dispatchers.IO).launch {
addSampleBooksToDatabase()
}
}
}

private fun addSampleBooksToDatabase() {
val category1 = CategoryEntity(EDUCATIONAL_BOOKS_CATEGORY_ID, "Educational Books", "Educational Books Desc")
val category2 = CategoryEntity(NOVELS_CATEGORY_ID, "Novels", "Novels Desc")
val category3 = CategoryEntity(OTHER_BOOKS_CATEGORY_ID, "Other Books", "Non Categorized Books")

val book1 = BookEntity(1, "Java Programming Book", 10.50, EDUCATIONAL_BOOKS_CATEGORY_ID)
val book2 = BookEntity(2, "Mathematics", 19.10, EDUCATIONAL_BOOKS_CATEGORY_ID)
val book3 = BookEntity(3, "Adventures of Joe Finn", 25.30, NOVELS_CATEGORY_ID)
val book4 = BookEntity(4, "The Hound the New York", 5.30, NOVELS_CATEGORY_ID)
val book5 = BookEntity(5, "Astrology", 56.99, OTHER_BOOKS_CATEGORY_ID)
val book6 = BookEntity(6, "Arc of Witches", 34.99, OTHER_BOOKS_CATEGORY_ID)
val book7 = BookEntity(7, "Can I Run?", 99.99, NOVELS_CATEGORY_ID)
val book8 = BookEntity(8, "Basic of Physics", 10.50, EDUCATIONAL_BOOKS_CATEGORY_ID)

val categoryDAO = libraryDatabase.getCategoryDAO()
categoryDAO.addCategory(category1)
categoryDAO.addCategory(category2)
categoryDAO.addCategory(category3)

val bookDAO = libraryDatabase.getBookDAO()
bookDAO.addBook(book1)
bookDAO.addBook(book2)
bookDAO.addBook(book3)
bookDAO.addBook(book4)
bookDAO.addBook(book5)
bookDAO.addBook(book6)
bookDAO.addBook(book7)
bookDAO.addBook(book8)
}

@Singleton
@Provides
fun providesRoomDatabase(): LibraryDatabase {
libraryDatabase = Room.databaseBuilder(libraryApplication, LibraryDatabase::class.java, "library_database")
.fallbackToDestructiveMigration()
.addCallback(databaseCallback)
.build()
return libraryDatabase
}

@Singleton
@Provides
fun providesCategoryDAO(libraryDatabase: LibraryDatabase) = libraryDatabase.getCategoryDAO()

@Singleton
@Provides
fun providesBookDAO(libraryDatabase: LibraryDatabase) = libraryDatabase.getBookDAO()
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,82 +1,15 @@
package com.sample.libraryapplication.database

import android.app.Application
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.sample.libraryapplication.database.dao.BookDAO
import com.sample.libraryapplication.database.dao.CategoryDAO
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

@Database(entities = [CategoryEntity::class, BookEntity::class], version = 1)
abstract class LibraryDatabase : RoomDatabase() {

abstract fun getCategoryDAO(): CategoryDAO
abstract fun getBookDAO(): BookDAO

companion object {

private const val EDUCATIONAL_BOOKS_CATEGORY_ID = 1L
private const val NOVELS_CATEGORY_ID = 2L
private const val OTHER_BOOKS_CATEGORY_ID = 3L

private val databaseCallback = object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
CoroutineScope(Dispatchers.IO).launch {
addSampleBooksToDatabase()
}
}
}

private fun addSampleBooksToDatabase() {
val category1 = CategoryEntity(EDUCATIONAL_BOOKS_CATEGORY_ID, "Educational Books", "Educational Books Desc")
val category2 = CategoryEntity(NOVELS_CATEGORY_ID, "Novels", "Novels Desc")
val category3 = CategoryEntity(OTHER_BOOKS_CATEGORY_ID, "Other Books", "Non Categorized Books")

val book1 = BookEntity(1, "Java Programming Book", 10.50, EDUCATIONAL_BOOKS_CATEGORY_ID)
val book2 = BookEntity(2, "Mathematics", 19.10, EDUCATIONAL_BOOKS_CATEGORY_ID)
val book3 = BookEntity(3, "Adventures of Joe Finn", 25.30, NOVELS_CATEGORY_ID)
val book4 = BookEntity(4, "The Hound the New York", 5.30, NOVELS_CATEGORY_ID)
val book5 = BookEntity(5, "Astrology", 56.99, OTHER_BOOKS_CATEGORY_ID)
val book6 = BookEntity(6, "Arc of Witches", 34.99, OTHER_BOOKS_CATEGORY_ID)
val book7 = BookEntity(7, "Can I Run?", 99.99, NOVELS_CATEGORY_ID)
val book8 = BookEntity(8, "Basic of Physics", 10.50, EDUCATIONAL_BOOKS_CATEGORY_ID)

val categoryDAO = getInstance(libraryApplication).getCategoryDAO()
categoryDAO.addCategory(category1)
categoryDAO.addCategory(category2)
categoryDAO.addCategory(category3)

val bookDAO = getInstance(libraryApplication).getBookDAO()
bookDAO.addBook(book1)
bookDAO.addBook(book2)
bookDAO.addBook(book3)
bookDAO.addBook(book4)
bookDAO.addBook(book5)
bookDAO.addBook(book6)
bookDAO.addBook(book7)
bookDAO.addBook(book8)
}

private lateinit var libraryApplication: Application

private var instance: LibraryDatabase? = null
fun getInstance(application: Application): LibraryDatabase {
libraryApplication = application
return if (instance == null) synchronized(this) {
instance = Room.databaseBuilder(application, LibraryDatabase::class.java, "library_database")
.fallbackToDestructiveMigration()
.addCallback(databaseCallback)
.build()
instance!!
} else
instance!!
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.sample.libraryapplication.repository

import android.app.Application
import androidx.lifecycle.LiveData
import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.database.dao.BookDAO
Expand All @@ -9,9 +8,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class BookRepository(application: Application) {
class BookRepository(libraryDatabase: LibraryDatabase) {

private var bookDAO: BookDAO = LibraryDatabase.getInstance(application).getBookDAO()
private var bookDAO: BookDAO = libraryDatabase.getBookDAO()

fun getBooks(categoryID: Long): LiveData<List<BookEntity>> {
return bookDAO.getCategoryBooks(categoryID)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.sample.libraryapplication.repository

import android.app.Application
import androidx.lifecycle.LiveData
import com.sample.libraryapplication.database.LibraryDatabase
import com.sample.libraryapplication.database.dao.CategoryDAO
Expand All @@ -9,9 +8,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class CategoryRepository(application: Application) {
class CategoryRepository(libraryDatabase: LibraryDatabase) {

private var categoryDAO: CategoryDAO = LibraryDatabase.getInstance(application).getCategoryDAO()
private var categoryDAO: CategoryDAO = libraryDatabase.getCategoryDAO()

fun getCategories(): LiveData<List<CategoryEntity>> {
return categoryDAO.getAllCategories()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.sample.libraryapplication.LibraryApplication
import com.sample.libraryapplication.R
import com.sample.libraryapplication.dagger.builders.BookViewModelFactory
import com.sample.libraryapplication.dagger.factory.BookViewModelFactory
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.databinding.ActivityBookBinding
import com.sample.libraryapplication.viewmodel.BookViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.sample.libraryapplication.LibraryApplication
import com.sample.libraryapplication.R
import com.sample.libraryapplication.dagger.builders.BookListViewModelFactory
import com.sample.libraryapplication.dagger.factory.BookListViewModelFactory
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
import com.sample.libraryapplication.databinding.ActivityBookListBinding
Expand Down Expand Up @@ -48,7 +48,7 @@ class BookListActivity : AppCompatActivity() {

setBinding()

observeViewModel(bookListViewModel)
observeViewModel()
}

private fun createViewModel() {
Expand All @@ -60,9 +60,11 @@ class BookListActivity : AppCompatActivity() {
LibraryApplication.instance.libraryComponent.inject(this)
}

private fun observeViewModel(bookListViewModel: BookListViewModel) {
private fun observeViewModel() {
bookListViewModel.isLoading.value = true
bookListViewModel.allCategories.observe(this, Observer { list ->
if (!isDestroyed) {
bookListViewModel.isLoading.value = false
list.forEach {
Log.d(TAG, "Category Name: ${it.categoryName} - Category Desc: ${it.categoryDesc}")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sample.libraryapplication.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.sample.libraryapplication.database.entity.BookEntity
import com.sample.libraryapplication.database.entity.CategoryEntity
Expand All @@ -10,6 +11,7 @@ import com.sample.libraryapplication.repository.CategoryRepository
class BookListViewModel(categoryRepository: CategoryRepository, private var bookRepository: BookRepository) : ViewModel() {

var allCategories: LiveData<List<CategoryEntity>> = categoryRepository.getCategories()
var isLoading = MutableLiveData<Boolean>()

fun getBooksListSelectedCategory(categoryID: Long) : LiveData<List<BookEntity>> {
return bookRepository.getBooks(categoryID)
Expand Down
Loading

0 comments on commit bd800e7

Please sign in to comment.