ساختن Database و Repository
ساختن DataRepository
کد های این بخش:
@Database(entities = [ProductEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun productDao(): ProductDao
companion object {
const val DATABASE_NAME = "basic-sample-db"
private val mIsDatabaseCreated = MutableLiveData<Boolean>()
@Volatile
private var instance: AppDatabase? = null
private var LOCK = AppDatabase::class
operator fun invoke(context: Context, executors: AppExecutors): AppDatabase {
if (instance == null) {
synchronized(LOCK) {
if (instance == null) {
instance = buildDatabase(context.applicationContext, executors)
instance?.updateDatabaseCreated(context.applicationContext)
}
}
}
return instance!!
}
private fun buildDatabase(appContext: Context, executors: AppExecutors): AppDatabase {
return Room
.databaseBuilder(appContext, AppDatabase::class.java, DATABASE_NAME)
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
executors.diskIO.execute {
addDelay()
// Generate the data for pre-population
val database =
AppDatabase(appContext, executors)
val products =
DataGenerator.generateProducts()
insertData(database, products)
database.setDatabaseCreated()
}
}
})
.build()
}
private fun addDelay() {
try {
Thread.sleep(4000)
} catch (ignored: InterruptedException) {
}
}
private fun insertData(database: AppDatabase, products: List<ProductEntity>) {
database.runInTransaction {
database.productDao().insertAll(products)
}
}
}
private fun setDatabaseCreated() {
mIsDatabaseCreated.postValue(true)
}
private fun updateDatabaseCreated(context: Context) {
if (context.getDatabasePath(DATABASE_NAME).exists()) {
setDatabaseCreated()
}
}
fun getDatabaseCreated(): LiveData<Boolean> {
return mIsDatabaseCreated
}
}
class DataRepository(private val database: AppDatabase) {
private var mObservableProducts: MediatorLiveData<List<ProductEntity>> = MediatorLiveData()
init {
mObservableProducts.addSource(
database.productDao().loadAllProducts()
) { productEntities ->
if (database.getDatabaseCreated().value != null) {
mObservableProducts.postValue(productEntities)
}
}
}
companion object {
@Volatile
private var instance: DataRepository? = null
private var LOCK = DataRepository::class
operator fun invoke(database: AppDatabase): DataRepository {
return instance ?: synchronized(LOCK) {
instance ?: DataRepository(database)
}
}
}
fun getProducts(): LiveData<List<ProductEntity>> {
return mObservableProducts
}
fun loadProduct(productId: Int): LiveData<ProductEntity> {
return database.productDao().loadProduct(productId)
}
}