Закрытие соединения с базой данных с помощью SqlBright
Я перенес следующую схему доступа к базе данных SQLite приложения Android в мир RxJava:
public List<Stuff> doStuff(){
synchronized (lock) {
open(); // this effectively checks for isOpen() then calls getWritableDatabase()
// query the database for stuff
close(); // SQLiteOpenHelper close method
return stuffList;
}
}
Что-то я борюсь, когда я должен закрыть соединение с базой данных? Я знаю, что существуют шаблоны, позволяющие вообще не закрывать соединение, а также закрывать соединение как часть метода Activity. Однако эти шаблоны потребовали бы от меня применения логики ко всему классу менеджера баз данных, которого я хотел бы избежать, если это возможно. Хотелось надеяться, что есть предложенный способ справиться с этим с помощью RxJava и, в частности, обертки SqlBright? Мой перенесенный код выглядит примерно так:
public Observable<List<Stuff>> doStuff(){
synchronized (lock) {
open();
String sql = <..>;
return db.createQuery(tableName, sql, args).mapToList(mStuffMapper);
// where do I close()?
}
}
Решение, которое я ищу, в идеале должно позволить мне изменить этот единственный метод, оставив остальное с текущим шаблоном открытия / закрытия.
1 ответ
Вы можете использовать подписку, чтобы закрыть соединение.
db.createQuery(tableName, sql, args)
.mapToList(mStuffMapper);
.doOnSubscribe(new Action0() {
@Override public void call() {
close();
}
});
Subscription subscribe = doStuff().subscribe();
subscribe.unsubscribe();