Android Jetpack

ROOM + Coroutine Flow - 4 (Why Room & Coroutine - 2)

----___<<<<< 2023. 1. 28. 05:09

Flow를 이용해서 데이터 변화를 감지해보겠습니다.

 

 

id 'kotlin-kapt'
// ROOM
def roomVersion = "2.5.0"

implementation("androidx.room:room-runtime:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$roomVersion")

// To use Kotlin annotation processing tool (kapt)
kapt("androidx.room:room-compiler:$roomVersion")

// Coroutine
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4")

// Coroutine + Room
implementation("androidx.room:room-ktx:$roomVersion")

 

class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
val inputArea = findViewById<EditText>(R.id.textInputArea)
val insertBtn = findViewById<Button>(R.id.insert)
val getAllBtn = findViewById<Button>(R.id.getData)
val deleteBtn = findViewById<Button>(R.id.delete)
val resultArea = findViewById<TextView>(R.id.resultArea)
val db = TextDatabase.getDatabase(this)
insertBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
db.textDao().insert(TextEntity(0, inputArea.text.toString()))
inputArea.setText("")
}
}
getAllBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
// val resultText = db.textDao().getAllDataNorMal().toString()
//
// withContext(Dispatchers.Main) {
// resultArea.text = resultText
// }
viewModel.readData().collect {
val resultText = it.toString()
withContext(Dispatchers.Main) {
resultArea.text = resultText
}
}
}
}
deleteBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
db.textDao().deleteAllData()
}
}
}
}
view raw MainActivity.kt hosted with ❤ by GitHub
class MainViewModel(application: Application) : AndroidViewModel(application) {
val context = getApplication<Application>().applicationContext
val db = TextDatabase.getDatabase(context)
fun readData() : Flow<List<TextEntity>> = db.textDao().getAllDataFlow()
}
@Dao
interface TextDao {
@Query("SELECT * FROM text_table")
fun getAllDataNorMal() : List<TextEntity>
@Query("SELECT * FROM text_table")
fun getAllDataFlow() : Flow<List<TextEntity>>
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(text : TextEntity)
@Query("DELETE FROM text_table")
fun deleteAllData()
}
view raw TextDao.kt hosted with ❤ by GitHub
@Database(entities = [TextEntity::class], version = 1)
abstract class TextDatabase : RoomDatabase() {
abstract fun textDao() : TextDao
companion object {
@Volatile
private var INSTANCE : TextDatabase? = null
fun getDatabase(
context : Context
) : TextDatabase {
return INSTANCE ?: synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
TextDatabase::class.java,
"text_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
view raw TextDatabase.kt hosted with ❤ by GitHub
@Entity(tableName = "text_table")
data class TextEntity (
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id : Int,
@ColumnInfo(name = "text")
var text : String
)
view raw TextEntity.kt hosted with ❤ by GitHub