第一步 创建数据库
object DBInstance {
private const val DB_NAME = "daily_record";
@Volatile
private var appDataBase: AppDataBase? = null
private lateinit var application: Application
fun init(application: Application){
this.application = application
}
fun getInstance():AppDataBase{
return appDataBase?: synchronized(this){
appDataBase?:buildDatabase()
}
}
private fun buildDatabase() =
Room.databaseBuilder(application, AppDataBase::class.java, DB_NAME)
.build()
}
第二步 定义表
@Entity
class Category {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id = 0
var title:String = ""
//标签类型 0(支出)/1(收入)
var type:Int = 0
}
@Entity
class RecordItemInfo {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "uid")
var uid = 0
//日期
var date:Date? = null
//金额
var money:Double = 0.0
//类型 支出(0)/收入(1)
var type = 0
var categoryId = 0
}
//这个是两张表关联的中间类 之后查询RecordItemInfo 查询的还是RecordItemInfo 这张表,返回的也是RecordAndCategory
class RecordAndCategory {
@Embedded
var record:RecordItemInfo? = null
@Relation(
parentColumn = "categoryId",
entityColumn = "id"
)
var category:Category? = null
}
第三部 定义dao 定义自己需要的查询方法
@Dao
interface CategoryDao {
@Insert
fun insertCategory(item:Category):Long
@Insert
fun insertCategorys(item:List<Category>):List<Long>
@Query("select * from Category")
fun queryCategory():List<Category>
@Query("select * from Category where type = (:type)")
fun queryCategoryByType(type:Int):List<Category>
@Query("select * from Category where title like '%' ||:type ||'%'")
fun queryCategoryByTagStr(type:String):List<Category>
}
第四部 提供dao 给 RoomDatabase
@Database(entities = [Category::class, RecordItemInfo::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDataBase : RoomDatabase() {
abstract fun getDailyRecordDao():DailyRecordDao
abstract fun getCategoryDao():CategoryDao
}
第五部 类型转换处理 date 转 Long
class Converters {
companion object {
@TypeConverter
@JvmStatic
fun fromTimestamp(value:Long?) : Date?{
LogUtil.e("fromTimestamp","$value")
return if(value == null) null else Date(value)
}
@TypeConverter
@JvmStatic
fun dateToTimestamp(date:Date?): Long {
LogUtil.e("dateToTimestamp","${date?.time ?: 0}")
return date?.time ?: 0;
}
}
}