경험의 기록

Room에서 기본형 이외의 자료를 저장하기 위해서는

TypeConverter 를 사용해야 한다.

 

https://github.com/HanYeop/RunnersHigh

 

HanYeop/RunnersHigh

달리기 기록 앱. Contribute to HanYeop/RunnersHigh development by creating an account on GitHub.

github.com

기본이 되는 코드는

여기서 확인할 수 있다.


 

아이템으로 이미지를 포함한 정보를 저장하여

리사이클러뷰로 보여주려고 한다.

 

@Entity(tableName = "run_table")
data class Run(
    var image: Bitmap? = null,
    var timestamp: Long = 0L,
    var avgSpeedInKMH: Float = 0f,
    var distanceInMeters: Int = 0,
    var timeInMillis: Long = 0,
    var caloriesBurned: Int = 0
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int? = null
}

데이터베이스에 저장하기 위한 엔티티를 만들어주고,

 

class Converters {

    // Bitmap -> ByteArray 변환
    @TypeConverter
    fun toByteArray(bitmap : Bitmap) : ByteArray{
        val outputStream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
        return outputStream.toByteArray()
    }

    // ByteArray -> Bitmap 변환
    @TypeConverter
    fun toBitmap(bytes : ByteArray) : Bitmap{
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    }
}

컨버터 클래스를 만들어준다.

여기서 @TypeConverter 어노테이션을 사용해준다.

@TypeConverter 을 사용하면 데이터베이스에서 자동으로 그 자료형에 맞는 메소드를 호출한다.

 

toByteArray는 비트맵을 바이트로 바꾸기 위한 메소드이고

toBitmap은 다시 비트맵으로 바꾸기 위한 메소드이다.

 

이미지를 저장할 때 toByteArray 를 통해 ByteArray 형태로 저장되어있다가

이미지를 불러올 때 toBitmap 를 통해 Bitmap의 형태가 되는 것이다.

 

/* entities = 사용할 엔티티 선언, version = 엔티티 구조 변경 시 구분해주는 역할
   exportSchema = 스키마 내보내기 설정 */
@Database(entities = [Run::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class RunDatabase : RoomDatabase() {

    abstract fun runDao() : RunDao
}

이제 데이터베이스 생성시에

@TypeConverters 어노테이션으로 아까 만든 클래스를 지정해주면 된다.

데이터베이스 생성 과정은 생략하였다.

 

이제 데이터베이스 내부 확인 시 이미지가 잘 저장되어 있는 것을 확인할 수 있다.

 

 

 

 

https://github.com/HanYeop/RunnersHigh

 

HanYeop/RunnersHigh

달리기 기록 앱. Contribute to HanYeop/RunnersHigh development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참조

https://developer.android.com/training/data-storage/room/referencing-data?hl=ko

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading