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进行增删改查 我用的是KotlinCoroutines 也可以配合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()
使用具体的方法即可
Demo:Github
网友评论