Jetpack之Room的使用

Android常用的SQLite框架

OrmLite:学习成本低,方便好用,底层通过反射机制实现,效率比GreenDAO低。可以执行SQL语句,多表联查等

GreenDAO:支持加密,效率高,官方持续更新

Room:JetPack官方组件

环境的准备

现在Room的最新版本是2.2.5

具体引用:

dependencies {
  def room_version = "2.2.5"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"

  // optional - Kotlin Extensions and Coroutines support for Room
  implementation "androidx.room:room-ktx:$room_version"

  // optional - Test helpers
  testImplementation "androidx.room:room-testing:$room_version"
}

 Room的组件

Room包含三个组件:

  • 数据库:继承RoomDatabase的抽象类
  • Entity:实体类,对应数据库中的表
  • DAO:具体使用数据库的方法

数据库:继承RoomDatabase的抽象类

@Database(entities = [TestEntity::class]//实体类, version = 1//版本号, exportSchema = false)
@TypeConverters(Converters::class)//类型
abstract class AppDatabase : RoomDatabase() {
abstract fun testDAO(): TestDAO

companion object {//单例模式
    @Volatile
    private var instance: AppDatabase? = null

    fun getInstance(context: Context): AppDatabase {
        return instance ?: synchronized(this) {
            instance ?: buildDatabase(context).also { instance = it }
        }
    }

    private fun buildDatabase(context: Context): AppDatabase {
        return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)//数据库名称
                .addCallback(
                        object : RoomDatabase.Callback() {//初始化完成回调
                            override fun onCreate(db: SupportSQLiteDatabase) {
                                super.onCreate(db)
                            }
                        }
                )
                .build()
    }
}
}

类型转换

对不能直接存储的数据比如列表等需要进行类型转换

/**
*方法不需要做特殊定义 
*这边直接使用了json作为转换的媒介,也可以使用其他的
**//
class Converters {

    @TypeConverter
    fun fromListToString(mList: List<String>?): String? {
        return if (mList.isNullOrEmpty()) "" else Convert.toJson(mList)
    }

    @TypeConverter
    fun stringToList(value: String?): List<String>? {
        if (value.isNullOrEmpty()) {
            return emptyList()
        }
        val listType = object : TypeToken<List<String>>() {
        }.type
        return Convert.fromJson(value, listType)
    }

}

 实体类

/**
 *    @Author : Cook
 *    @Date   :  
 *    @Desc   :
 */
@Entity(tableName = "TEST")//表名
data class TESTEntity(
        val id: String 
) {

    @PrimaryKey(autoGenerate = true)//主键  是否自动增长
    var UUID: Long = 0

    @Ignore//忽略,数据库不存
    var isCheck = ObservableBoolean(false)
 

DAO(接口)

IDE会自动对代码合法性进行校验,写错会直接编译不通过,不用担心运行时crash

可以直接使用SQL进行增删改查 我用的是Kotlin Coroutines  也可以配合Rxjava使用

/**
 *    @Author : Cook
 *    @Date   :  
 *    @Desc   :
 */
@Dao//DAO注解必须
interface ThemeDAO {
    /**
     * 新增一笔
     *
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun add(entity: TESTEntity): Long
   //更新
    @Update(onConflict = OnConflictStrategy.REPLACE)
    suspend fun update(entity: TESTEntity): Int
    @Query("select *  from TEST where id=:id LIMIT 1")//查询
    suspend fun queryByID(id: String): TESTEntity?

    @Delete//删除
    suspend fun delete(entity: TESTEntity): Int

}

调用

   AppDatabase.getInstance(MyApplication.instance.applicationContext).TestDAO()

  使用具体的方法即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值