Записи базы данных комнат в RecyclerView - PullRequest
1 голос
/ 20 марта 2020

Я хочу показать Номер базы данных записей в RecyclerView . Пока у меня есть скелет Комнаты, и я могу показать некоторый фиктивный контент (не из комнаты) в RecyclerView:

enter image description here

Однако у меня есть проблемы с показом Комнаты Записи БД вместо фиктивного контента. В Arduino система ввода-вывода EEPROM когда-то была почти единственной, но в Android Room эта концептуально простая задача кажется сложной и не слишком сложной задачей. Это подводит меня к моему первому вопросу:

1) Поскольку в моем случае база данных довольно тонкая и простая, есть ли более простой подход, чем Room, использующий меньше накладных расходов и классов?

Что касается подхода в комнате, я считаю, что я довольно близок. У меня возникают трудности при реализации следующего:

2) Как я могу заменить for-l oop в init DummyContent записями Room-DB (allJumps из ViewModel)?

Вот что я получил до сих пор (я не публиковал ничего под ViewModel, например, Repository и DAO, так как это сейчас не должно интересовать):

DummyItems (dummy содержимое, подлежащее замене записями БД комнаты)

object DummyContent {

    // An array of sample (dummy) items.
    val ITEMS: MutableList<DummyItem> = ArrayList()

    // A map of sample (dummy) items, by ID.
    val ITEM_MAP: MutableMap<String, DummyItem> = HashMap()

    private val COUNT = 25

    init {
        // Add some sample items.
        // TO BE REPLACED BY ROOM DB ENTRIES <----------------------------------------------------
        for (i in 1..COUNT) {
            addItem(createDummyItem(i))
        }
    }

    private fun addItem(item: DummyItem) {
        ITEMS.add(item)
        ITEM_MAP.put(item.id, item)
    }

    private fun createDummyItem(position: Int): DummyItem {
        return DummyItem(position.toString(), "Item " + position, makeDetails(position))
    }

    private fun makeDetails(position: Int): String {
        val builder = StringBuilder()
        builder.append("Details about Item: ").append(position)
        for (i in 0..position - 1) {
            builder.append("\nMore details information here.")
        }
        return builder.toString()
    }

    // A dummy item representing a piece of content.
    data class DummyItem(val id: String, val content: String, val details: String) {
        override fun toString(): String = content
    }
}

allJumps / JumpData

// allJumps is of type LiveData<List<JumpData>>

@Entity
data class JumpData (
    @PrimaryKey var jumpNumber: Int,
    var location: String?
}

ViewModel

class JumpViewModel(application: Application) : AndroidViewModel(application) {

    // The ViewModel maintains a reference to the repository to get data.
    private val repository: JumpRepository
    // LiveData gives us updated words when they change.
    val allJumps: LiveData<List<JumpData>>

    init {
        // Gets reference to WordDao from WordRoomDatabase to construct
        // the correct WordRepository.
        val jumpsDao = JumpRoomDatabase.getDatabase(application, viewModelScope).jumpDao()
        repository = JumpRepository(jumpsDao)
        allJumps = repository.allJumps // OF INTEREST <----------------------------------------------------
    }

    fun insert(jump: JumpData) = viewModelScope.launch {
        repository.insert(jump)
    }

    fun getJumps() : LiveData<List<JumpData>> {
        return allJumps
    }
}

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете попытаться добавить это к object DummyContent

object DummyContent {
    val jumpsLiveData = MutableLiveData<List<JumpData>>()

    private val observedLiveData: LiveData<List<JumpData>>? = null
    private val dataObserver = object : Observer<List<JumpData>> {
        override fun onChanged(newList: List<JumpData>) {
            // Do something with new data set
        }
    }
    fun observeJumpsData(jumpsLiveData: LiveData<List<JumpData>>) {
        observedLiveData?.removeObserver(dataObserver)
        observedLiveData = jumpsLiveData.apply { 
            observeForever(dataObserver)
        }
    }
}

И это для блока инициализации viewModel:

init {
        val jumpsDao = JumpRoomDatabase.getDatabase(application, viewModelScope).jumpDao()
        repository = JumpRepository(jumpsDao)
        allJumps = repository.allJumps
        DummyContent.observeJumpsData(getJumps())
    }

По этому коду DummyContent автоматически подпишется на новый данные после ViewModel создания

И в 'Activity', где вы создали RecyclerView, добавьте этот текст в конец onCreate:

override fun onCreate(savedState: Bundle?) {
  DummyContent.jumpsLiveData.observe(this, Observer {
    recyclerAdapter.changeItemsList(it)
  }
}

changeItemsList - метод, который изменяет данные вашего переработчика, я полагаю, вы уже создали его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...