This is my note for Udemy lesson: Advanced Android Bootcamp 2024.
Entity
@Entity(tableName = "subscriber_data_table") data class Subscriber( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "subscriber_id") val id: Int, @ColumnInfo(name = "subscriber_name") val name: String, @ColumnInfo(name = "subscriber_email") val email: String )
DAO
@Dao interface SubscriberDAO { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertSubscriber(subscriber: Subscriber): Long @Update suspend fun updateSubscriber(subscriber: Subscriber) @Delete suspend fun deleteSubscriber(subscriber: Subscriber) @Query("DELETE FROM subscriber_data_table") suspend fun deleteAll() @Query("SELECT * FROM subscriber_data_table") fun getAllSubscribers(): LiveData<List<Subscriber>> }
Database
@Database(entities = [Subscriber::class], version = 1) abstract class SubscriberDatabase: RoomDatabase() { abstract val subscriberDAO: SubscriberDAO companion object { @Volatile private var INSTANCE: SubscriberDatabase? = null fun getInstance(context: Context): SubscriberDatabase { synchronized(this) { if (INSTANCE == null) { val instance = Room.databaseBuilder( context.applicationContext, SubscriberDatabase::class.java, "subscriber_data_database" ).build() INSTANCE = instance } return INSTANCE!! } } } }
Repository
Technically it is not required but according to some Android MVVM best practice, better to have.
class SubscriberRepository(private val dao: SubscriberDAO) { val subscribers = dao.getAllSubscribers() suspend fun insert(subscriber: Subscriber) { dao.insertSubscriber(subscriber) } suspend fun update(subscriber: Subscriber) { dao.updateSubscriber(subscriber) } suspend fun delete(subscriber: Subscriber) { dao.deleteSubscriber(subscriber) } suspend fun deleteAll() { dao.deleteAll() } }