package com.example.firstapp
|
|
import android.content.Context
|
import androidx.room.Database
|
import androidx.room.Room
|
import androidx.room.RoomDatabase
|
import androidx.room.TypeConverters
|
import androidx.room.migration.Migration
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
import com.example.firstapp.database.dao.CodeDao
|
import com.example.firstapp.database.dao.KeywordDao
|
import com.example.firstapp.database.dao.MsgDao
|
import com.example.firstapp.database.dao.ReminderDao
|
import com.example.firstapp.database.entity.Code
|
import com.example.firstapp.database.entity.KeywordEntity
|
import com.example.firstapp.database.entity.Msg
|
import com.example.firstapp.database.entity.Reminder
|
import com.example.firstapp.utils.DATABASE_NAME
|
import com.example.firstapp.utils.SettingUtils
|
import com.example.firstapp.utils.TAG_LIST
|
|
import com.example.firstapp.database.ext.ConvertersDate
|
import com.example.firstapp.model.CourierStat
|
import com.example.firstapp.model.DailyStat
|
|
|
@Database(
|
entities = [
|
Msg::class,
|
Code::class,
|
KeywordEntity::class,
|
Reminder::class
|
],
|
views = [
|
CourierStat::class,
|
DailyStat::class
|
],
|
version = 20,
|
exportSchema = false
|
)
|
@TypeConverters(ConvertersDate::class)
|
abstract class AppDatabase : RoomDatabase() {
|
abstract fun msgDao(): MsgDao
|
abstract fun codeDao(): CodeDao
|
abstract fun keywordDao(): KeywordDao
|
abstract fun reminderDao(): ReminderDao
|
|
companion object {
|
@Volatile
|
private var instance: AppDatabase? = null
|
|
fun getInstance(context: Context): AppDatabase {
|
return instance ?: synchronized(this) {
|
instance ?: buildDatabase(context).also { instance = it }
|
}
|
}
|
|
private fun buildDatabase(context: Context): AppDatabase {
|
val builder = Room.databaseBuilder(
|
context.applicationContext, AppDatabase::class.java, DATABASE_NAME
|
).allowMainThreadQueries() //TODO:允许主线程访问,后面再优化
|
.addCallback(object : Callback() {
|
override fun onCreate(db: SupportSQLiteDatabase) {
|
|
}
|
}).addMigrations(
|
|
MIGRATION_MSG,
|
)
|
|
/*if (BuildConfig.DEBUG) {
|
builder.setQueryCallback({ sqlQuery, bindArgs ->
|
println("SQL_QUERY: $sqlQuery\nBIND_ARGS: $bindArgs")
|
}, Executors.newSingleThreadExecutor())
|
}*/
|
|
return builder.build()
|
}
|
|
|
|
|
|
private val MIGRATION_MSG = object : Migration(19, 20) {
|
override fun migrate(database: SupportSQLiteDatabase) {
|
//database.execSQL("Create table Msg as Select id,type,`from`,content,(case when sim_info like 'SIM1%' then '0' when sim_info like 'SIM2%' then '1' else '-1' end) as sim_slot,sim_info,sub_id,time from Logs where 1 = 1")
|
database.execSQL(
|
"""
|
CREATE TABLE "Msg" (
|
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
"type" TEXT NOT NULL DEFAULT 'sms',
|
"from" TEXT NOT NULL DEFAULT '',
|
"content" TEXT NOT NULL DEFAULT '',
|
"sim_slot" INTEGER NOT NULL DEFAULT -1,
|
"sim_info" TEXT NOT NULL DEFAULT '',
|
"sub_id" INTEGER NOT NULL DEFAULT 0,
|
"time" INTEGER NOT NULL
|
)
|
""".trimIndent()
|
)
|
|
database.execSQL("CREATE UNIQUE INDEX \"index_Msg_id\" ON \"Msg\" ( \"id\" ASC)")
|
|
// 新增 KeywordEntity 表的创建逻辑
|
database.execSQL("""
|
CREATE TABLE IF NOT EXISTS `keywords` (
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
`keyword` TEXT NOT NULL,
|
`type` TEXT NOT NULL,
|
`isEnabled` INTEGER NOT NULL
|
)
|
""")
|
|
// 创建 CourierStat 视图
|
database.execSQL("""
|
CREATE VIEW IF NOT EXISTS CourierStat AS
|
SELECT courierName, COUNT(*) as count
|
FROM packages
|
GROUP BY courierName
|
""")
|
|
// 创建 DailyStat 视图
|
database.execSQL("""
|
CREATE VIEW IF NOT EXISTS DailyStat AS
|
SELECT date(receivedTime/1000, 'unixepoch', 'localtime') as date,
|
COUNT(*) as count
|
FROM packages
|
GROUP BY date(receivedTime/1000, 'unixepoch', 'localtime')
|
""")
|
// database.execSQL("""
|
// CREATE TABLE IF NOT EXISTS `reminders` (
|
// id INTEGER PRIMARY KEY AUTOINCREMENT,
|
// type TEXT NOT NULL,
|
// nickname TEXT NOT NULL,
|
// keywords TEXT NOT NULL,
|
// );
|
// """)
|
|
}
|
}
|
|
}
|
|
}
|