close

什麼是 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


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()