как правильно сохранить ответ в базе данных комнаты? - PullRequest
0 голосов
/ 08 апреля 2020

Привет всем, я разрабатываю новостное приложение. Я реализовал базу данных помещений с помощью kotlin сопрограмм, чего я хочу достичь. Сначала я хочу получить данные, затем данные, которые я хочу сохранить в базе данных помещений, но данные не отображаются вообще под моей базой данных. реализация

@Database(entities = [Article::class], version = 1, exportSchema = false)
@TypeConverters(SourceTypeConverters::class)
abstract class SportNewsDatabase : RoomDatabase() {

    abstract fun sportNewsDao(): SportNewsDao

    companion object {
        private var instance: SportNewsDatabase? = null
        fun getInstance( context: Context): SportNewsDatabase? {
            if (instance == null) {
                synchronized(SportNewsDatabase::class.java) {
                    instance = Room.databaseBuilder(context.applicationContext, SportNewsDatabase::class.java, "article_database")
                        .fallbackToDestructiveMigration()
                        .build()
                }
            }
            return instance
        }
    }


}

SportNewsDao.kt

@Dao
interface SportNewsDao {

    @Query("SELECT * FROM  Article")
    fun getAllData(): LiveData<List<Article>>

    @Insert
    suspend fun addAll(article: List<Article>)


    @Update
    suspend fun updateArticle(article: Article)

    @Delete
    suspend fun deleteArticle(article: Article)

}

ниже NewsRepository.kt

class NewsRepository(private val sportNewsApi: SportNewsInterface, private val sportNewsDao: SportNewsDao) {

        val data = sportNewsDao.getAllData()

        suspend fun refresh() {
            withContext(Dispatchers.IO) {
                val articles = sportNewsApi.getNewsAsync().body()?.articles
                if (articles != null) {
                    sportNewsDao.addAll(articles)
                }
            }
        }
    }

ниже MainViewModel.kt

@Suppress("UNCHECKED_CAST")
class MainViewModel(val newsRepository: NewsRepository) : ViewModel(), CoroutineScope {
    // Coroutine's background job
    val job = Job()
    // Define default thread for Coroutine as Main and add job
    override val coroutineContext: CoroutineContext = Dispatchers.Main + job

    val showLoading = MutableLiveData<Boolean>()
    val sportList = MutableLiveData<List<Article>>()
    val showError = SingleLiveEvent<String>()

    fun loadNews() {
        // Show progressBar during the operation on the MAIN (default) thread
        showLoading.value = true
        // launch the Coroutine
        launch {
            // Switching from MAIN to IO thread for API operation
            // Update our data list with the new one from API
            val result = withContext(Dispatchers.IO) {
                newsRepository?.data
                newsRepository.refresh()
            }
        }
    }
}

Я хочу чтобы знать, где я делаю ошибку, что я должен сделать, чтобы правильно сохранить ответ в базе данных и показать данные для моего android приложения.

1 Ответ

0 голосов
/ 09 апреля 2020

Это моя помощь вам отладить то, что происходит. Вы можете получить созданный файл БД на своем телефоне с помощью Обозревателя файлов устройств

Вид -> Инструмент Windows -> Обозреватель файлов устройств.

Затем перейдите к базе данных и загрузите их. на вашем компьютере p c.

Загрузите браузер БД SQLite и осмотрите БД.

...