Закрытие соединения с базой данных с помощью 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();
Другие вопросы по тегам