Android Room 數據庫框架的使用

1 引入相應的依賴

    //數據庫
    def room_version = "2.3.0"

    implementation "androidx.room:room-runtime:$room_version"
//    annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
    kapt "androidx.room:room-compiler:$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"

2 編寫RoomDatabase

package com.****.server.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.tonly.server.model.engine.Engine
import com.tonly.server.model.enginespeed.EngineSpeed
import com.tonly.server.model.fault.Fault
import com.tonly.server.model.location.Location
import com.tonly.server.model.login.CarInfo
import com.tonly.server.model.notification.Notification
import com.tonly.server.model.productions.Productions
import com.tonly.server.model.refuel.RefuelRecord
import com.tonly.server.model.treedata.Car

@Database(
    entities = [
        CarInfo::class,
        Engine::class,
        EngineSpeed::class,
        Fault::class,
        Location::class,
        Notification::class,
        Car::class,
        RefuelRecord::class,
        Productions::class
               ],
    version = 6,
    exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun carInfoDao(): CarInfoDao?
    abstract fun engineDao(): EngineDao?
    abstract fun faultDao(): FaultDao?
    abstract fun locationDao(): LocationDao?
    abstract fun userDao(): NotificationDao?
    abstract fun engineSpeedDao(): EngineSpeedDao?
    abstract fun productionDao(): ProductionDao?
    abstract fun carDao(): CarDao?
    abstract fun refuelRecordDao(): RefuelRecordDao?

    companion object {
        private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    "CREATE TABLE IF NOT EXISTS `Productions` (`local_db_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `list_id` INTEGER NOT NULL, `local_db_uid` TEXT, `plate` TEXT, `tboxVin` TEXT, `teamName` TEXT, `resName` TEXT, `classes` TEXT, `photoId` TEXT, `deviceId` TEXT, `deviceName` TEXT, `frameNo` TEXT, `uploadTime` TEXT, `sum` INTEGER NOT NULL)"
                )
            }
        }

        private val MIGRATION_2_3 = object : Migration(2, 3) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    "CREATE TABLE IF NOT EXISTS `Car` (`local_db_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `local_db_uid` TEXT, `frameNo` TEXT, `carId` TEXT, `gpsTermina` TEXT, `updateTime` TEXT, `averageFuelConsu` TEXT, `engineMileage` TEXT, `engineSpeed` INTEGER NOT NULL, `engineRunTime` TEXT, `oilPres` TEXT, `totalFule` TEXT, `apparatusSpeed` TEXT, `sOnline` INTEGER NOT NULL)"
                )
            }
        }
        //新增加油記錄表
        private val MIGRATION_3_4 = object : Migration(3, 4) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    "CREATE TABLE IF NOT EXISTS `RefuelRecord` (`local_db_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `local_db_uid` TEXT, `createBy` TEXT, `createTime` TEXT, `frameNo` TEXT, `carId` TEXT, `comeOnSite` TEXT, `fuelCharge` TEXT, `confirmTheMileage` TEXT, `gpsTermina` TEXT, `diggingsCode` TEXT)"
                )
            }
        }

        //增加貨箱容積
        private val MIGRATION_4_5 = object : Migration(4, 5) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    "ALTER TABLE CarInfo ADD COLUMN containerVolume TEXT"
                )
                database.execSQL(
                    "ALTER TABLE CarInfo ADD COLUMN actualCapacity TEXT"
                )
            }
        }
        //增加車輛類型
        private val MIGRATION_5_6 = object : Migration(5, 6) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    "ALTER TABLE CarInfo ADD COLUMN carType TEXT"
                )
            }
        }
        @Volatile
        private var INSTANCE: AppDatabase? = null
        @JvmStatic
        fun getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context,
                    AppDatabase::class.java,
                    "cat_cache")
                    .addMigrations(MIGRATION_1_2)
                    .addMigrations(MIGRATION_2_3)
                    .addMigrations(MIGRATION_3_4)
                    .addMigrations(MIGRATION_4_5)
                    .addMigrations(MIGRATION_5_6)
                    .build()
                INSTANCE = instance
                instance
            }
        }
    }
}

3 編寫DAO

package com.****.server.database

import androidx.room.*
import com.****.server.model.treedata.Car

@Dao
interface CarDao {
    //增
    @Insert
    fun add(item: Car?)

    @Insert
    fun addAll(data: List<Car?>?)

    //刪
    @Delete
    fun delete(item: Car?)

    //改
    @Update
    fun update(item: Car?)

    //模糊查詢
    @Query("SELECT * FROM Car WHERE sOnline =:state and local_db_uid=:userId")
    fun queryByState(state: Int?, userId: String?): List<Car?>?


    //模糊查詢
    @Query("SELECT * FROM Car WHERE frameNo like '%' || :text || '%'  or carId like '%' || :text || '%' and local_db_uid=:userId")
    fun queryByFrameNo(text: String?, userId: String?): List<Car?>?
    //查
    @Query("SELECT * FROM Car WHERE local_db_uid=:userId")
    fun queryUserAll(userId: String?): List<Car?>?

    @Query("DELETE FROM Car")
    fun deleteAll()
}

4 使用

AppDatabase.getInstance(getContext()).carInfoDao().addAll(carInfoList);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章