Komunikacja serwisu z viewModel i bazą danych room

0

Cześć.
Mam serwis który powinien skanować okolicę w poszukiwaniu sieci wifi i chciałbym jakoś przesłać listę ScanResult do ViewModel oraz bazy danych żeby wyświetlać w RecyclerView listę tych sieci oraz zapisywać historię tych skanów.

WifiService jest typu LifecycleService bo próbowałem jeszcze umieszczać LiveData w samym serwisie, poza tym to prawie 1 do 1 serwis wzięty z android.com https://developer.android.com/guide/topics/connectivity/wifi-scan

class serwis : LifecycleService() {

    private val wifiManager = this.getSystemService(Context.WIFI_SERVICE) as WifiManager

    private val wifiScanReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                scanSuccess()
            } else {
                scanFailure()
            }
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        super.onStartCommand(intent, flags, startId)
        
            lifecycleScope.launch(Dispatchers.Default) {
            
            val intentFilter = IntentFilter()
            intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
            registerReceiver(wifiScanReceiver, intentFilter)

            val success = wifiManager.startScan()
            if (!success) {
                // scan failure handling
                scanFailure()
            }
        }

        return START_NOT_STICKY
    }

    private fun scanSuccess() {
        // UPDATE LISTY W VIEW MODEL
        // WYSLANIE DANYCH DO BAZY DANYCH

    }

    // handling scan failure
    private fun scanFailure() {
        // UPDATE LISTY W VIEW MODEL
    }

    override fun onBind(intent: Intent): IBinder? {
        super.onBind(intent)
        return null
    }
}

ViewModel miałby też pobierać historię skanów z bazy danych i na przycisk fragment przełączałby się między historią a aktualną listą sieci wifi

class WifiListViewModel(val database: WifiScanDao, application: Application) : AndroidViewModel(application) {

    val wifiList = MutableLiveData<List<ScanResult>>()

    val wifiListHistory = MutableLiveData<List<WifiScan>>()

    init {
        initializeHistory()
    }

    private fun initializeHistory() {
        viewModelScope.launch {
            wifiListHistory.value = getScansFromDatabase()
        }
    }

    private suspend fun getScansFromDatabase(): List<WifiScan> {
        return database.getAllScans()
    }

}

A więc problem jest taki że nie wiem w jaki sposób mógłbym przekazać dane z serwisu do view model oraz bazy danych. Proszę o jakieś podpowiedzi :)

Baza danych obecnie wygląda tak, na razie mało jest pól w modelu ale to na próbę.

wifidatabase.kt

@Database(entities = [WifiScan::class], version = 1, exportSchema = false)
abstract class WifiDatabase : RoomDatabase() {

    abstract val wifiScanDao: WifiScanDao

    companion object {

        @Volatile
        private var INSTANCE: WifiDatabase? = null

        fun getInstance(context: Context): WifiDatabase {
            synchronized(this) {
                var instance = INSTANCE

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        WifiDatabase::class.java,
                        "sleep_history_database"
                    )
                        .fallbackToDestructiveMigration()
                        .build()
                    INSTANCE = instance
                }
                return instance
            }
        }
    }
}




wifiscan.kt

@Entity(tableName = "wifi_scan_results")
data class WifiScan(
    @PrimaryKey(autoGenerate = true)
    var scanId: Long = 0L,

    @ColumnInfo(name = "scan_time")
    val timeMili: Long = System.currentTimeMillis()
)



wifiscandao.kt

@Dao
interface WifiScanDao {

    @Insert
    fun insert(scan: WifiScan)

    @Query("SELECT * FROM wifi_scan_results ORDER BY scan_time DESC")
    fun getAllScans(): List<WifiScan>
}
1

Zapis do db z serwisu, VM potem czyta z db.

1 użytkowników online, w tym zalogowanych: 0, gości: 1