今天看了一眼项目,想用Room代替现有数据存储的方式,于是简单看了下文档进行替换
一:了解三个必备的注解及对应的类:
1、Entity:也就是我们定义的实体类,会通过注解映射到相应库字段
@Entity(tableName = "user")
class UserData {
// 分配自动ID
@PrimaryKey(autoGenerate = true) var id:Int=0
// @Ignore // 其他构造方法需要添加此字段
// 可指定字段名,不指定则为默认的key命
@ColumnInfo(name = "userName") var user_name :String? = null
companion object {
val instance: User by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
User()
}
}
}
2、Dao:通过dao操作数据库的增删改查
import androidx.room.*
import retrofit2.http.DELETE
@Dao
interface UserDataDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)// 当有老数据时就覆盖掉
fun insertUser(user: UserData?): Long // 返回的long值为插入的条目的主键
@Query("SELECT * FROM user")
fun getUser(): UserData
@Query("SELECT * FROM user WHERE USER_ID = :userId") // 语句与sql一样 like等等
fun getUser(userId: String):UserData
@Update
fun update(user: UserData): Int // 返回int值为更新多少条
@Update
fun update(vararg user: UserData): Int
@Delete
fun delete(user: UserData)
}
3、Database:库信息,我们这里只需要继承RoomDatabase,当然也可以根据自己的需求定制一些其他的
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.suyuemobi.kouhong.app.App
// 指定到表的映射关系和数据库版本
@Database(entities = [UserData::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
abstract fun userDao(): UserDataDao
companion object{
val instance:MyDatabase by lazy (mode =LazyThreadSafetyMode.SYNCHRONIZED){
Room.databaseBuilder(App.instance,MyDatabase::class.java,"xxx").build()
}
}
}
二:配置Room
首先,项目根gradle文件加入库依赖:
// kotlin版本
implementation rootProject.ext.room["runtime"]
kapt rootProject.ext.room["compiler"] // Kotlin 的话用kapt
// java版本
implementation rootProject.ext.room["runtime"]
annotationProcessor rootProject.ext.room["compiler"]
然后,指定注解生成的文件路径。
//指定room.schemaLocation生成的文件路径
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
最后,我们就可以使用了
// 注意查询等操作需要在非主线程进行
thread {
var user = userDao.insertUser(user)
toast(user.user_name)
}.start()
三:有点不爽的地方
现在感觉有点不爽的就是依赖等其他配置只能在app下的模块配置不能抽取到base模块下。不知道是不是有办法自己不知道。如果有欢迎大家指点哦!