android room 使用


引入依賴

def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"

在android 配置中加入
apply plugin: 'kotlin-kapt' //kapt

android{
... defaultConfig{
...
//指定room.schemaLocation生成的文件路徑 javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } } ... }

 

 

定義相應的實體類

@Entity(tableName = "t_user")
class User {
    @PrimaryKey
    @NonNull
    var id: String = ""
    var username: String? = null
    var name: String? = null
    var sex: Int? = null
    var pic: String? = null
    var area: String? = null
    var phone: String? = null
    var address: String? = null
    var disabled: Boolean? = null
    var delFlag: Boolean? = null
}

字符串主鍵 一定要添加 @NonNull 注解

下面就是dao了

@Dao
interface UserDao {
    @Query("select * from t_user where id=:id limit 1")
    fun get(id:String): User?

    @Query("select * from t_user where delFlag = false")
     fun query():List<User>

    //插入或更新
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertOrUpdate(user: User)

    @Query("delete from t_user where id=:id")
    fun delete(id: String)
}

然后就是database類

@Database(entities = [User::class, 其他定義的數據類...],version = 1,exportSchema = true)
@TypeConverters(DateConverter::class, BoolConverter::class)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao
   ...

}
@TypeConverters 這里使用了兩個自定義的轉換器 處理 
1.數字轉boolean
class BoolConverter {

    @TypeConverter
    fun revertBool(value: Number): Boolean {
        return value == 1
    }

    @TypeConverter
    fun converterNum(value: Boolean): Number {
        return if(value) 1 else 0
    }

}

 

2.毫秒數轉日期
class DateConverter {

    @TypeConverter
    fun revertDate(value: Long): Date {
        return Date(value)
    }

    @TypeConverter
    fun converterDate(value: Date): Long {
        return value.time
    }

}

然后定義一個database幫助類

object AppDatabaseHelper {

    private var appDatabase: AppDatabase

    init {
        //MyApp 是自定義application類
        val appContext = MyApp.instance.applicationContext
        appDatabase = Room.databaseBuilder(appContext, AppDatabase::class.java,"mydb")
            .allowMainThreadQueries()
            .fallbackToDestructiveMigration() //升級數據庫版本 清空數據庫
                //.addMigrations(MIGRATION_1_2,...) 可以自己定制數據庫遷移
            .build()


//        比如1版本升級2版本 消息表增加了一個字段msgId
//        val MIGRATION_1_2 = object :Migration(1,2){
//            override fun migrate(database: SupportSQLiteDatabase) {
//                database.execSQL("ALTER TABLE t_msg "
//                        + " ADD COLUMN msgId TEXT");
//            }
//        }
    }

    fun getInstance(): AppDatabase {
        return appDatabase
    }

}
最后是使用
private val userDao = AppDatabaseHelper.getInstance().userDao()
//調用dao的各種方法就可以使用了
//需要注意,不能再主線程使用

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM