使用RxJava批量插入

时间:2015-05-01 09:40:51

标签: android sqlite rx-java

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

单个插入操作很容易实现,但速度很慢。理想情况下,我想批量插入对象并将这些对象的列表传递给db。

我可以看到如何强制执行它但我真的想用RxJava做但不确定如何。

由于

2 个答案:

答案 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));