使用 RxJava 批量插入

Batching inserts with RxJava

我需要从 JSon 提要加载数据(最多 22,000 条记录)并将它们存储在我的 android 设备上(在 SQLite 中)。

单独插入很容易实现,但速度很慢。理想情况下,我想批量处理要插入的对象并将这些对象的列表传递给数据库。

我知道如何强制执行,但我真的很想用 RxJava 来执行,但不确定如何。

谢谢

您可以使用 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));

您可以使用 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 库。