android room 使用基本流程

186 阅读1分钟

第一步 创建数据库

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;
        }
    }
}