什麼是 Room
Room 是 Google 在 I/O '17 上發佈的資料庫管理元件
簡單的來說就是 SQLite 的 ORM 層 (Object Relational Mapping)
以前我們常會用到 XUtils、greenDao、Realm 這些元件
現在都可以用 Room 來取代
使用 Room有 3 個優點:
1、SQL查詢在編譯時會檢查每個 @Query、@Entity 和 table 是否存在等
2、程式碼簡潔
3、可結合 LiveData
該如何使用呢?
第一步,引入 Room Library
def room_version = "2.2.1"
implementation "androidx.room:room-runtime:$room_version"
// For Kotlin use kapt instead of annotationProcessor
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
各位可以依需求去增減引入
第二步,建立 Entity Class
@Entity(tableName = "cars")
data class Car(
@PrimaryKey @ColumnInfo(name = "id") val cId: String,
val name: String,
val imageUrl: String = ""
)
每個 @Entity 都會自動被建為一張 table
每項 Field 都會對應 column, 但名稱不同時需用 @ColumnInfo 來對應
如,table.id => Car.cId
而主 key 就用 @PrimaryKey 來標示
第三步,建立 DAOs (Data Access Objects)
@Dao
interface CarDao {
@Query("SELECT * FROM cars WHERE id = :mId")
fun getCar(mId: String): LiveData<Car>
}
用 @Dao 來標示一個 interface
功能是用來對 Database 做 Query 的動作
也有 @Insert @Delete @Update 等基本指令
省去寫 SQL 的功夫
第四步,建立 Database
@Database(entities = [Car::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun carDao(): CarDao
val database = Room.databaseBuilder(
context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.build();
}
用 @Database 標示一個 abstract class 且包含 Dao
裡面需要設定 entities 以確認 create 的時候 entity 會也會被 create
最後就是用 Room.databaseBuilder 來建立 Database 了
而 @TypeConverters 則是一個自訂義轉換器
比如說下面的時間 Long to Calender 轉換
class Converters {
@TypeConverter fun calendarToDatestamp(calendar: Calendar)
: Long = calendar.timeInMillis
@TypeConverter fun datestampToCalendar(value: Long)
: Calendar = Calendar.getInstance().apply {
timeInMillis = value }
}
第五步,建立 Repository
最後一步,就是使用我們剛剛所建立的所有東西啦
用 Repository 來將其串起來
所有的操作都將由此進行,如下
class CarRepository
private constructor(private val carDao: CarDao) {
fun getCar(carId: String) = carDao.getCar(carId)
}
至此,我們已經可以順利的讀寫 SQLite 了
不過這些只是 Room 的基本用法
這裡還有 7 項進階用法的小技巧
資料來源:
https://developer.android.com/jetpack/androidx/releases/room
https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1#4785
https://medium.com/androiddevelopers/7-steps-to-room-27a5fe5f99b2