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);