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的各种方法就可以使用了 //需要注意,不能再主线程使用
分类:
android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2015-09-17 sqlserver text/ntext 字段读取