- vừa được xem lúc

[Android] TypeConverter Annotation trong Room Database

0 0 50

Người đăng: Lương Trung Hiếu

Theo Viblo Asia

Trong bài này mình sẽ hướng dẫn anh em setup @TypeConverter trong Room database

1. Room database là gì?

The Room persistence library provides an abstraction layer over SQLite to allow for more robust database access while harnessing the full power of SQLite.

Room là một persistence library, một phần của Android Architecture Components. Nó giúp bạn dễ dàng là việc với đối tượng SQLiteDatabase trong ứng dụng của bạn hơn, giảm số lượng mã soạn sẵn và xác minh các truy vấn SQL tại thời điểm biên dịch.

Trước khi Room được ra mắt, chúng ta phải viết rất nhiều dòng lệnh phức tạp, dài loằng ngoằng, cơ bản là rất tốn thời gian để setup SQLite ? . Room xuất hiện như một vị cứu tinh giúp đỡ anh em, từng câu lệnh, từng query cực kì đơn giản và dễ hiểu. Room cung cấp rất nhiều function, hỗ trợ lưu trữ các dữ liệu nguyên thủy nhưng nó không hỗ trợ các Class Object cho người dùng tự định nghĩa. Tuy nhiên các bạn không phải lo lắng về điều này. TypeConverter lại xuất hiện để cứu anh em. TypeConverter có thể convert một Custom Class sang kiểu dữ liệu mà Room có thể lưu trữ được và ngược lại.

2. Cài đặt

@Entity(tableName = "current_weather")
data class CurrentWeatherResponse(
val coord: Coord,
@PrimaryKey
val id: Int,
val main: Main,
val name: String,
val sys: Sys,
val visibility: Int,
val weather: List<Weather>,
val wind: Wind
): Serializable

Đây là một Entity của Database tuy nhiên, Entity này có những property không phải dữ liệu nguyên thủy như: Coord, Main, Sys, List<Weather>, Wind. Sau đây chúng ta sẽ bắt tay vào định nghĩa lớp Converters để convert các propery này nhé:

class Converters { @TypeConverter fun toCoord(coord: String): Coord? { return Gson().fromJson<Coord>(coord,Coord::class.java) } @TypeConverter fun fromCoord(coord: Coord): String? { return Gson().toJson(coord) } @TypeConverter fun toWind(wind: String): Wind? { return Gson().fromJson<Wind>(wind,Wind::class.java) } @TypeConverter fun fromWind(wind: Wind): String? { return Gson().toJson(wind) } @TypeConverter fun toMain(main: String): Main? { return Gson().fromJson<Main>(main,Main::class.java) } @TypeConverter fun fromMain(main: Main): String? { return Gson().toJson(main) } @TypeConverter fun toSys(sys: String): Sys? { return Gson().fromJson<Sys>(sys,Sys::class.java) } @TypeConverter fun fromSys(sys: Sys): String? { return Gson().toJson(sys) } @TypeConverter fun toWeather(weather: String): List<Weather>? { val listType = object : TypeToken<ArrayList<Weather>>(){}.type return Gson().fromJson<List<Weather>>(weather,listType) } @TypeConverter fun fromWeather(weather: List<Weather>): String? { return Gson().toJson(weather) }
}

Như mình đã đề cập, Room chỉ lưu trữ các kiểu dữ liệu nguyên thủy nên giải pháp ở đây là convert Object -> dữ liệu nguyên thủy. Và mình sử dụng Gson để convert Object -> String. Bạn phải tạo 2 function để convert qua lại: Object -> String và String -> Object (như mình đã tạo là to... & from...) Đừng quên Anotation @TypeConverter trên mỗi function nhé.

3. Kết thúc

@Database( entities = [CurrentWeatherResponse::class], version = 1, exportSchema = false
)
@TypeConverters(Converters::class)
abstract class WeatherDatabase : RoomDatabase() { abstract fun getWeatherDao(): WeatherDao companion object{ @Volatile private var instance: WeatherDatabase?=null private val LOCK = Any() operator fun invoke(context: Context) = instance?: synchronized(LOCK){ instance?: createDatabase(context).also{ instance = it } } private fun createDatabase(context: Context) = Room.databaseBuilder( context.applicationContext, WeatherDatabase::class.java, "weather.db" ).build() }
}

Bước cuối cùng là thêm Anotation @TypeConverters(Converters::class) ở abstract class Database nữa nhé. Vậy là bạn đã setup TypeConverter vào dự án của bạn thành công.

Code được lấy trong project:

Github: https://github.com/iamhiutrun/Weather_Forecast

Tác giả: Lương Trung Hiếu

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 281

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 215

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 107

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 101

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 68

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 315