一、需求
用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