通用 rxjava2 数据库访问层

Generic rxjava2 database access layer

我刚开始使用 java/rxjava2/android 开发并设法获得以下工作示例:

    Observable<Object> source3 = Observable.create(emitter-> {
                cursor = app.dbh.getAlllTransactions2();
                emitter.onNext(cursor);
                emitter.onComplete();
    }).subscribeOn(Schedulers.io());

    source3.subscribe(c -> {
        transactionAdapter = new TransactionCursorAdapter(this.getActivity(), (Cursor)c);
        LSTVW_transactions.setAdapter(transactionAdapter);
    });

现在我有两个问题:

  1. 我怎么被迫使用 Object 作为类型。如果我用别的东西 android 工作室表示需要 Object.是不是因为lambda表达式。我之前做过测试,他们允许我使用任何类型。
  2. 我想以更通用的方式制作以下内容。目标是将 Observable 作为结果,并将任意 db 函数作为参数,然后一般调用该函数。可以在此处找到我发现的一个较旧的示例,但我不知道如何将其转换为 lambda/rxjava2 样式(原始 link:https://dzone.com/articles/easy-sqlite-android-rxjava

我想转换的此类设置示例:

private static <T> Observable<T> makeObservable(final Callable<T> func) {
  return Observable.create(
      new Observable.OnSubscribe<T>() {
          @Override
          public void call(Subscriber<? super T> subscriber) {
            try {
              subscriber.onNext(func.call());
            } catch(Exception ex) {
              Log.e(TAG, "Error reading from the database", ex);
            }
          }
    });
}

试试这个:

Observable.create((ObservableOnSubscribe<YourType>) e -> { ... }

我不明白你想用第二个片段实现什么,但我认为你可以简化这个主体,用于 makeObservable 方法(我刚刚删除了 try-catch 部分):

return Observable.create(e -> e.onNext(func.call()));

关于 Rx 滥用:我认为将 Cursor 作为流的项目传递不是一个好主意。您可能会从数据库中读取数据流,以便您的观察者可以做出正确的反应。