通用 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);
});
现在我有两个问题:
- 我怎么被迫使用 Object 作为类型。如果我用别的东西
android 工作室表示需要 Object.是不是因为lambda表达式。我之前做过测试,他们允许我使用任何类型。
- 我想以更通用的方式制作以下内容。目标是将 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 作为流的项目传递不是一个好主意。您可能会从数据库中读取数据流,以便您的观察者可以做出正确的反应。
我刚开始使用 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);
});
现在我有两个问题:
- 我怎么被迫使用 Object 作为类型。如果我用别的东西 android 工作室表示需要 Object.是不是因为lambda表达式。我之前做过测试,他们允许我使用任何类型。
- 我想以更通用的方式制作以下内容。目标是将 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 作为流的项目传递不是一个好主意。您可能会从数据库中读取数据流,以便您的观察者可以做出正确的反应。