Почему бы не попробовать запросы по частям, чтобы переполнение CursorWindowSize
не происходило. Вы можете настроить DAO на
interface MyDbObjectDao {
@Query("SELECT * FROM myTable WHERE mySearchName LIKE :value LIMIT :startIndex, :endIndex")
fun mySearchQueryBetween(value: String, startIndex: Int, endIndex: Int): Single<List<MySearchData>>
@Query("SELECT * FROM myTable WHERE mySearchName LIKE :value LIMIT :tillIndex")
fun mySearchQueryStart(value: String, tillIndex: Int): Single<List<MySearchData>>
}
Если возвращаемые данные также огромны, то я рекомендую вам взглянуть на PagingLibrary
с android https://developer.android.com/topic/libraries/architecture/paging/ и интегрировать его в комнату. Это поможет вам отобразить результаты, которые вы, по сути, отобразите в пользовательском интерфейсе.
Наконец, у вас может быть рекурсивный вызов с окном индекса
class MyRepository(val myDao: MyDbObjectDao) {
private val searchProcessor = BehaviorProcessor.create<List<SearchData>>()
private var searchIndex = 1
fun queryMySearch(value: String) : Flowable<List<SearchData>> {
startSearch(value)
return searchProcessor.hide()
}
private fun startSearch(value: String) {
if (searchIndex * searchableWindow) >= myDao.totalRowCount()) {
searchProcessor.onComplete()
return
}
if (searchIndex = 1) {
myDao.mySearchQueryStart(value, searchableWindow)
.subscribeOn(Schedulers.io())
.subscribe({ onSearchCall(value, it) }, { searchProcessor.onError(it) })
} else {
myDao.mySearchQueryBetween(value, searchableWindow.startIndex, searchableWindow.endIndex)
.subscribeOn(Schedulers.io())
.subscribe({ onSearchCall(value, it) }, { searchProcessor.onError(it) })
}
}
private fun onSearchCall(value: String, list: List<MySearchData>) {
if (list.isNotEmpty()){
searchProcessor.onNext(list.map { it.toSearchData() })
}
searchIndex++
startSearch(value)
}
private val Int.startIndex : Int
get() = this * (searchIndex -1)
private val Int.endIndex : Int
get() = this * searchIndex
companion object {
private const val searchableWindow = 200
}
}
по вашему мнению вы можете
class MySearchFragment : BaseFragment(), SearchView.OnQueryTextListener {
override fun onQueryTextChange(String newText) {
viewModel.queryMySearchToRepo(newText)
.observeOn(AndroidSchedulers.mainThread)
.subscribe(this@MySearchFragment::adaptList, { it.printStackTrace() }, {
recyclerView?.hideLoadingProgress()
})
return true;
}
private fun adaptList(list: List<SearchData>) {
// set or add data to the adapter accordingly
// with notifyRangeInserted(adapterList.size -1, list.size)
}
}
Все это асинхронные операции с синхронной рекурсией, так что запрос к БД не слишком частый, а также вы не столкнетесь с переполнением CursorWindow> 2 МБ. Надеюсь, это поможет
Примечание : В этом примере используется Rx Java2, поэтому подписка вызывает