RxJava2 запрос SQLite - PullRequest
       20

RxJava2 запрос SQLite

0 голосов
/ 23 января 2019

В моем приложении для Android я бы хотел использовать RxJava2 вместо AsyncTasks для запроса моей локальной базы данных SQLite.Я не хочу использовать Room или SqlBrite оболочки.Так можно ли получить, например, Observable<List<Invoice>> из такого запроса?Если да, приведите пример.

например, я хочу поместить следующий метод в шаблон Observable-Observer, чтобы он возвращал Observable<List<Invoice>>

private List<Invoice> fetchInvoices() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(JPBContentProvider.CONTENT_URI,
                    null, null, null, null);
            if (cursor != null) {
                List<Invoice> list = new ArrayList<>();
                while (cursor.moveToNext()) {
                   list.add(Invoice.from(cursor));
                }
                return list;
            } 
        } catch (Exception ex) {
            return null;
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
    }

1 Ответ

0 голосов
/ 23 января 2019

Есть много способов достичь того, что вы хотите.Вы не предоставили много контекста, поэтому я буду использовать в качестве примера следующее:

  • у вас есть Invoice s, хранящиеся в базе данных
  • у вас есть метод, который выбирает этииз БД и возвращает результаты в виде List

Пример для Kotlin, хотя будет очень похож на Java.

Итак, вот ваш метод извлечения БД:

fun queryInvoices(): List<Invoice>{
    val results = arrayListOf<Invoice>()
    // your logic to retrieve data from SQLite
    return results
  }

Предполагая, что вам нужно извлекать различные типы данных, имеет смысл определить универсальный метод, который будет выполнять магию Rx.Это в основном 1-строчный в Kotlin:

fun <T>rxFetchData(func: () -> List<T>): Single<List<T>> = Single.fromCallable(func)

Как это работает: аргумент этого метода - функция, которая не принимает аргументов (в этом примере) и возвращает List некоторого типа. Single.fromCallable откладывает выполнение этой функции до тех пор, пока вы не подпишетесь (проверьте ссылку для получения дополнительной информации).

Использование:

fun fetchInvoices() {
  rxFetchData(::queryInvoices)
      .subscribeOn(io())
      .observeOn(mainThread())
      .subscribe(
          { data ->
            Log.i("onSuccess", " fetched ${data.size} invoices")
          },
          { error ->
            error.printStackTrace()
          })
}

А вот импорт, который выпотребуется:

import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers.mainThread
import io.reactivex.schedulers.Schedulers.io

ОБНОВЛЕНИЕ

Вы можете сделать что-то подобное (Java):

public Single<List<Invoice>> invoices(){
  return Single.fromCallable(this::fetchInvoices);
}
...