使用 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 库。
我需要从 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 库。