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()
使用具体的方法即可