2013-12-03 4 views
0

это сохранить, чтобы начать и совершить транзакцию, дважды используя базу данных getWriteableDatabase(). У меня есть этот сценарий, если я хочу использовать два объектов DAO в одной транзакцииSqlite Transaction

Что-то вроде этого:

SqliteDatabase db = userDao.getWriteableDatabase(); 

try{ 

    userDao.insert(firstname, lastname); 
    addressDao.insert(street); 
    // commit 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
catch(Exception e){ 
    // rollback 
    db.endTransaction(); 
} 

Где:

class UserDao extends Dao { 

    public void insert(String firstname, String lastname){ 

     SqliteDatabase db = getWriteableDatabase(); 

     ... 
     db.insertOrThrow(...); 
      } 

} 

class AdressDao extends Dao { 

    public void insert(String street){ 

     SqliteDatabase db = getWriteableDatabase(); 

     ... 
     db.insertOrThrow(...); 
      } 

} 

getWriteableDatabase() это просто ярлык для SQLiteOpenHelper.getWriteableDatabase()

Так безопасно работать таким образом в транзакции или getWriteableDatabase() возвращает другой экземпляр, и поэтому транзакция больше не находится в правильный объем?

Если это так я мог бы передать SqliteDatabase в качестве параметра к DAO, как

SqliteDatabase db = userDao.getWriteableDatabase(); 

try{ 

    userDao.insert(db, firstname, lastname); 
    addressDao.insert(db, street); 
    // commit 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
catch(Exception e){ 
    // rollback 
    db.endTransaction(); 
} 
+0

Сфера применения даже не проблема. Вы не можете открыть один и тот же файл базы данных дважды. В старых версиях Android вы рискуете повреждением и потерей данных. В новых версиях вы получите исключение. Если приведенный выше код работает для вас, то ваш базовый класс Dao, похоже, кэширует соединение с базой данных. Это то, что делает SqliteOpenHelper внутри. – tiguchi

+0

Я использую один и тот же SqliteOpenHelper в каждом базовом классе Dao, поэтому файл базы данных не будет открыт дважды. – sockeqwe

ответ

0

getWritableDatabase() создает экземпляр в первый раз, который вызывается и кэшировать возвращаемое значение. Таким образом, вы не открываете db дважды, и да, это безопасно.

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