Kotlin:使用Room框架

一、需求
用room框架进行数据存储
二、实现步骤
1.在app的build.gradle中配置与Room相关的信息
首先,在最前面加入这句

apply plugin: 'kotlin-kapt'

接着,在build.gradle的defaultConfig中加入这段

javaCompileOptions{
    annotationProcessorOptions{
        arguments = [
                "room.schemaLocation"  : "$projectDir/schemas".toString(),
                "room.incremental"     : "true",
                "room.expandProjection": "true"]
    }
}

最后,在build.gradle的denpendencies中加入这两句

//Room
implementation "androidx.room:room-runtime:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"

在build.gradle中与ROOM相关的配置完成了
2.使用单例模式创建一个Application,用来提供全局上下文

class App : Application() {

    companion object{
        var instance: App by Delegates.notNull()
        fun instance() = instance
    }

   ···
    override fun onCreate() {
        super.onCreate()
        ···
        instance = this
    }

   ···
}

3.创建需要的表,我需要三张表(记录姨妈第一天信息的表FirstMenses,记录姨妈其他天的表Menses,记录默认设计的表MensesSetting)
Menses.class

package com.example.meetyou.db;

import androidx.annotation.ColorInt
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "Menses")
data class Menses(
    @PrimaryKey(autoGenerate = true)
    var mensesId: Int?,
    @ColumnInfo(name = "m_first_id")
    var menFirstId:Int?,
    @ColumnInfo(name = "m_date")
    var menDate: String?,
    @ColumnInfo(name = "m_flow")
    var menFlow: Int?,
    @ColumnInfo(name = "m_pain")
    var menPain: Int?
)

FirstMenses.class

package com.example.meetyou.db

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "FirstMenses")
data class FirstMenses(
    @PrimaryKey(autoGenerate = true)
    var menFirstId: Int?,
    @ColumnInfo(name = "men_first_date")
    var menFirstDate: String?,
    @ColumnInfo(name = "men_first_pain")
    var menFirstPain: Int?,
    @ColumnInfo(name = "men_first_flow")
    var menFirstFlow: Int?,
    @ColumnInfo(name = "men_setting_id")
    var menFirstSettingId : Int?,
    @ColumnInfo(name = "men_keep")
    var menKeep: Int?
)

MensesSetting.class

package com.example.meetyou.db

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "MensesSetting")
data class MensesSetting (
    @PrimaryKey(autoGenerate = true)
    var menSettingId: Int?,
    @ColumnInfo(name = "m_near_date")
    var menNearDate: String?,
    @ColumnInfo(name = "m_keep_day")
    var menKeepDay: Int?,
    @ColumnInfo(name = "m_cycle_day")
    var menCycleDay:Int?
)

4.创建对表进行操作的接口

package com.example.meetyou.db

import androidx.room.*

@Dao
interface BaseDao<T> {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(list:MutableList<T>)

    @Delete
    fun delete(element: T)

    @Delete
    fun deleteList(elements:MutableList<T>)

    @Delete
    fun deleteSome(vararg elements:T)

    @Update
    fun update(element: T)

}

以下示范对FirstMenses表的操作,其他两个表省略

package com.example.meetyou.db

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query

@Dao
interface FirstMensesDao:BaseDao<FirstMenses> {

    //增加新的第一天姨妈
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(element: FirstMenses)

    //通过姨妈日期查询当天的姨妈流量
    @Query("select men_first_flow from FirstMenses where men_first_date = :clickDate")
    fun getMenFirstFlow(clickDate: String):Int

    //通过姨妈日期查询当天的姨妈疼痛
    @Query("select men_first_pain from FirstMenses where men_first_date = :clickDate")
    fun getMenFirstPain(clickDate: String):Int

    //查询表中所有第一天的姨妈日期
    @Query("select men_first_date from FirstMenses")
    fun getAllMenFirstDate():List<String>

    //查询所有数据
    @Query("select * from FirstMenses")
    fun getAllMenFirst():List<FirstMenses>

    //删除第一天的姨妈日期根据点击日期
    @Query("delete from FirstMenses where men_first_date = :clickDate")
    fun deleteMenFirstDateByClick(clickDate: String)

    //修改流量
    @Query("update FirstMenses set men_first_flow = :inputFlow where men_first_date = :clickDate")
    fun modifyMenFirstFlowByClick(clickDate: String,inputFlow: Int)

    //修改疼痛程度
    @Query("update FirstMenses set men_first_pain = :inputPain where men_first_date = :clickDate")
    fun modifyMenFirstPainByClick(clickDate: String,inputPain:Int)

    //修改姨妈第一天日期
    @Query("update FirstMenses set men_first_date = :inputDate where men_first_date = :clickDate")
    fun modifyMenFirstDateByDate(inputDate: String, clickDate: String)

    //根据日期找到姨妈第一天的id
    @Query("select menFirstId from FirstMenses where men_first_date = :clickDate")
    fun getMensesIdByClick(clickDate: String):Int

    //修改持续天数
    @Query("update FirstMenses set men_keep = :keep where men_first_date = :clickDate")
    fun modifyFirstKeepDay(keep: Int,clickDate: String)

    //根据id找到对象
    @Query("select * from FirstMenses where menFirstId = :id")
    fun getFirstMenses(id: Int):FirstMenses


}

上面的操作方法里面的参数根据自己的需求自己定
5.创建AppDataBase

package com.example.meetyou.db

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.meetyou.app.App
import com.example.meetyou.db.AppDataBase.Companion.instance
import com.example.meetyou.ui.fragment.CalendarFragment

@Database(entities = [Menses::class,MensesSetting::class,FirstMenses::class],version = 1)
abstract class AppDataBase : RoomDatabase() {

    abstract fun getMensesDao():MensesDao
    abstract fun getMensesSettingDao():MensesSettingDao
    abstract fun getFirstMensesDao():FirstMensesDao

    companion object{
        val instance = Single.sin
    }

    private object Single{
        val sin: AppDataBase = Room.databaseBuilder(
            App.instance(),
            AppDataBase::class.java,
            "User.db"
        )
            .allowMainThreadQueries()
            .build()
    }

}

6.表建完了,操作也有了,现在就可以进行增删改查了
首先获得每一个表的dao

//姨妈设置表
private val menSettingDao = AppDataBase.instance.getMensesSettingDao()
//第一天姨妈表
private val firstMenDao = AppDataBase.instance.getFirstMensesDao()
//姨妈表
private val menDao = AppDataBase.instance.getMensesDao()

一个简单的示例,在设置表中加入信息,查看表中的内容,其中要借助集合来读取表中的内容

val menSetting1 = MensesSetting(1,menNearDate,menKeepDay,menCycleDay)
val menSettingList = mutableListOf<MensesSetting>()
menSettingList.add(menSetting1)
//如果设置表是空的,加入新的
if(menSettingDao.getAll().isEmpty()){
    menSettingDao.insertAll(menSettingList)
}

//获取设置表中的内容
var menSettingFromDataList:MutableList<MensesSetting>
= menSettingDao.getAll() as MutableList<MensesSetting>
//打印出来查看表中内容
for(i in menSettingFromDataList.indices){
    val c = menSettingFromDataList[i]
    println(c)
    Timber.d("room====数据库中姨妈设置表中的内容=====$i======$c")
}

7.设置表是最先增加的,首先设置好姨妈的最近一天的日期,持续天数以及周期;根据设置表中的日期,进行预测显示;存储第一天的姨妈表将最近的姨妈日期写入,持续天数默认为设置表中的持续天数,周期也是用默认表的,不过后面可以自己改;根据第一天的姨妈,在其他天姨妈表中加入后面的日期。
要注意的是,
1。当第一天姨妈表中的一个数据被删除,相应的其他天姨妈也要被删除,
2.当第一天姨妈表中持续天数被改变,相应的其他天的姨妈表也要有所改变
使用Room框架,我是从这篇文章看到的


参考博客:
https://blog.csdn.net/u014620028/article/details/90719716

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值