package com.rssuper.database import android.content.Context import androidx.room.Database import androidx.room.Entity import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.rssuper.converters.DateConverter import com.rssuper.converters.FeedItemListConverter import com.rssuper.converters.StringListConverter import com.rssuper.database.daos.FeedItemDao import com.rssuper.database.daos.SearchHistoryDao import com.rssuper.database.daos.SubscriptionDao import com.rssuper.database.entities.FeedItemEntity import com.rssuper.database.entities.SearchHistoryEntity import com.rssuper.database.entities.SubscriptionEntity import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.Date @Database( entities = [ SubscriptionEntity::class, FeedItemEntity::class, SearchHistoryEntity::class ], version = 1, exportSchema = true ) @TypeConverters(DateConverter::class, StringListConverter::class, FeedItemListConverter::class) abstract class RssDatabase : RoomDatabase() { abstract fun subscriptionDao(): SubscriptionDao abstract fun feedItemDao(): FeedItemDao abstract fun searchHistoryDao(): SearchHistoryDao companion object { @Volatile private var INSTANCE: RssDatabase? = null fun getDatabase(context: Context): RssDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, RssDatabase::class.java, "rss_database" ) .addCallback(DatabaseCallback()) .build() INSTANCE = instance instance } } } private class DatabaseCallback : RoomDatabase.Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) INSTANCE?.let { database -> CoroutineScope(Dispatchers.IO).launch { createFTSVirtualTable(db) } } } override fun onOpen(db: SupportSQLiteDatabase) { super.onOpen(db) createFTSVirtualTable(db) } private fun createFTSVirtualTable(db: SupportSQLiteDatabase) { db.execSQL(""" CREATE VIRTUAL TABLE IF NOT EXISTS feed_items_fts USING fts5( title, description, content, author, content='feed_items', contentless_delete=true ) """.trimIndent()) } } }