在我的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();
}
}
}
答案 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);
}