Kotlin Flow를 사용한 회의실 데이터베이스

13654 단어 androidkotlin
저는 Amit Shekhar , 개발자들이 고임금 기술직을 구하도록 돕는 멘토입니다.

이번 블로그에서는 Android에서 KotlinRoom Database과 함께 Flow를 사용하는 방법에 대해 알아보겠습니다. 기본 MVVM 아키텍처를 따르는 KotlinViewModel을 사용하여 Flow 내부에 코드를 작성하는 방법을 배웁니다.

이 문서는 원래 amitshekhar.me에 게시되었습니다.

구현 부분에 다음 프로젝트를 사용할 것입니다. 이 프로젝트는 단순성을 위해 기본 MVVM 아키텍처를 따릅니다. 프로젝트 자체에서 이 블로그에 언급된 구현을 위한 전체 코드를 찾을 수 있습니다.

GitHub 프로젝트: Learn Kotlin Flow

먼저 아래와 같이 룸 데이터베이스에 대한 종속성을 설정해야 합니다.

implementation "androidx.room:room-runtime:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
implementation "androidx.room:room-ktx:2.4.3"


참고: 항상 사용 가능한 최신 버전을 확인하십시오.

앱 수준 Gradle 파일에 주석 처리를 위한 Kotlin 플러그인을 추가하는 것을 잊지 마세요.

plugins {
    id 'kotlin-kapt'
}


이제 아래와 같이 엔터티data 클래스User를 만듭니다.

@Entity
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String?,
    @ColumnInfo(name = "email") val email: String?,
    @ColumnInfo(name = "avatar") val avatar: String?
)


User 엔터티 클래스의 경우 Room Database에 필요한 Dao를 생성해야 하며 이름을 UserDao로 지정합니다.

@Dao
interface UserDao {

    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Insert
    fun insertAll(users: List<User>)

    @Delete
    fun delete(user: User)

}


이제 AppDatabase를 확장하는 클래스RoomDatabase를 만들어야 합니다.

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

}


그 후에 DatabaseBuilder 가 될 Singleton 클래스가 필요합니다.

object DatabaseBuilder {

    private var INSTANCE: AppDatabase? = null

    fun getInstance(context: Context): AppDatabase {
        if (INSTANCE == null) {
            synchronized(AppDatabase::class) {
                if (INSTANCE == null) {
                    INSTANCE = buildRoomDB(context)
                }
            }
        }
        return INSTANCE!!
    }

    private fun buildRoomDB(context: Context) =
        Room.databaseBuilder(
            context.applicationContext,
            AppDatabase::class.java,
            "learn-kotlin-flow"
        ).build()

}


그런 다음 DatabaseHelper 인터페이스를 생성합니다.

interface DatabaseHelper {

    fun getUsers(): Flow<List<User>>

    fun insertAll(users: List<User>): Flow<Unit>

}


그런 다음 DatabaseHelperImpl 인터페이스를 구현하는 클래스DatabaseHelper를 만듭니다.

class DatabaseHelperImpl(private val appDatabase: AppDatabase) : DatabaseHelper {

    override fun getUsers(): Flow<List<User>> = flow {
        emit(appDatabase.userDao().getAll())
    }

    override fun insertAll(users: List<User>): Flow<Unit> = flow {
        appDatabase.userDao().insertAll(users)
        emit(Unit)
    }

}


여기서 반환 유형이 Flow 임을 이해해야 합니다. 또한 흐름 빌더를 사용하고 요구 사항에 따라 항목을 내보냅니다.

이렇게 하면 아래와 같이 DatabaseHelper의 인스턴스를 만들 수 있습니다.

val dbHelper = DatabaseHelperImpl(DatabaseBuilder.getInstance(applicationContext))


마지막으로 이 인스턴스를 필요할 때마다 전달할 수 있습니다.

class RoomDBViewModel(private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper) : ViewModel() {

    init {
        fetchUsers()
    }

    private fun fetchUsers() {
        viewModelScope.launch {
            dbHelper.getUsers()
                .flowOn(Dispatchers.IO)
                .catch { e ->
                    // handle exception
                }
                .collect {
                    // list of users from the database
                }
        }
    }

}


이렇게 하면 Android에서 KotlinViewModel을 사용하여 데이터베이스를 쿼리할 수 있습니다.

Android에서 Kotlinusers과 함께 Room Database를 사용하는 방법입니다.

지금은 그게 다입니다.

감사

Amit Shekhar

다음에서 나와 연결할 수 있습니다.


  • GitHub
  • Facebook

  • Read all of my high-quality blogs here.

    좋은 웹페이지 즐겨찾기