我需要从JSon Feed加载数据(最多22,000条记录)并将它们存储在我的Android设备上(在SQLite中)。
单个插入操作很容易实现,但速度很慢。理想情况下,我想批量插入对象并将这些对象的列表传递给db。
我可以看到如何强制执行它但我真的想用RxJava做但不确定如何。
由于
答案 0 :(得分:4)
您可以使用buffer运算符来累积对象。
示例:
Observable<String> stringObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
for (int i = 0; i < 9; i++) {
subscriber.onNext("a");
}
subscriber.onCompleted();
}
});
stringObservable
.buffer(5)
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() {
Log.i("rxjava", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.i("rxjava", "onError");
}
@Override
public void onNext(List<String> strings) {
Log.i("rxjava", "onNext " + strings.size());
db.beginTransaction();
try {
for (String string: strings) {
//insert data here
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
});
输出:
onNext 5
onNext 4
onCompleted
由于我是RxJava的初学者,我无法判断这是否是实现目标的最有力方法。
如果您正在寻找反应性SQLite,您应该查看SQLBrite库。
答案 1 :(得分:0)
您可以使用SQL事务在单个事务中插入项目。
db.beginTransaction();
try {
//insert data here
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
编辑1:
这样的事情会起作用吗?
myObservable.insertIntoDatabase(json)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(//called when the insert is complete);
编辑2:
使用SQL事务一次插入NUM_ITEMS。
myObservable.buffer(NUM_ITEMS).flatMap(new Func1<List<String>, Observable<String>>() {
@Override
public Observable<String> call(List<String> strings) {
//insert items here using SQL transaction
return Observable.just("Inserted items " + strings.size());
}
}).subscribe(s -> System.out.println(s));