2013-04-23 4 views
3

Я разрабатываю приложение android, в котором я часто использую доступ к локальной базе данных. К этой базе данных можно получить доступ с разных сторон, поэтому у меня есть проблема координации для базы данных. Я использую следующие методы: open() и close().Android: открытие и закрытие базы данных SQLite

public void open(){ 
    mDb=mDbHelper.getWritableDatabase(); 
} 

public void close(){ 
     mDb.close(); 
} 

Так, обычно, когда мне нужно, чтобы получить доступ к БД для некоторых операций я открыть базу данных, то я выполнить какую-то операцию, и я, наконец, закрыть базу данных. Код, который я обычно использую для этой цели является следующим:

try { 
     dbManager.open(); 
        // database operation 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     try { 
      dbManager.close(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

Но, если для этого фрагмента коды используются от differnts нитей (предположив нить А и нить B) Следующая может ситуация возникает:

A thread: performs open() 
B thread: perfroms open() 
A thread: perfroms some operation 
A thread: performs close() 
B thread: try to perform some operation but it fails! 

Итак, единственное решение, которое я могу догадаться, я должен выполнить open() при запуске приложения и close(), когда мое приложение будет остановлено. Я не уверен, что это может быть хорошим решением?

В действительности, документация getWritableDatabase() метода (вызывается из моего open()) говорит:

Make sure to call close() when you no longer need the database 

Итак, кто может предложить мне альтернативное решение?

+1

не близко дб, просто закрыть только курсор к этим данным – umesh

+0

синхронизации доступа или делать DB опа на одну нить только –

+0

... или построить ContentProvider ... – Selvin

ответ

2

Вы можете использовать одиночный экземпляр, и вы можете не закрывать базу данных (но держите транзакцию закрытой). Существует некоторая информация:

Android SQLite DB When to Close

1

Создайте класс-оболочку, добавьте член целочисленного атома и каждый раз, когда вы открываете базу данных, увеличивайте член, когда вы его закрываете, уменьшаете член, а если член равен нулю, фактически закрывайте db.

+1

как семафор ????? – stinepike

+1

no, у вас будет атомное целое, чтобы узнать, когда действительно закрыть db, и вы вызовете закрыть оболочку и внутри оболочки, только если этот int равен 0, вы фактически закроете db –

Смежные вопросы