RxJava2查询SQLite

时间:2019-01-23 08:42:55

标签: android android-asynctask android-sqlite observable rx-java2

在我的Android应用程序中,我想使用RxJava2而不是AsyncTasks来查询本地SQLite数据库。我不想使用RoomSqlBrite包装器。那么是否有可能从这样的查询中获取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 :(得分:1)

有很多方法可以实现您想要的。您没有提供太多上下文,因此我以以下示例为例:

  • 您有一些Invoice存储在数据库中
  • 您有一些方法可以从数据库中获取这些方法,并以List的形式返回结果

该示例是针对Kotlin的,尽管在Java中还是非常相似。

这是您的数据库提取方法:

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

假设您需要获取不同类型的数据,则定义一个通用方法来实现Rx魔术是有意义的。这基本上是科特林的1班轮:

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);
}