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的各种方法就可以使用了
//需要注意,不能再主线程使用

 

 

 

posted @   荣超  阅读(919)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2015-09-17 sqlserver text/ntext 字段读取
点击右上角即可分享
微信分享提示