это сохранить, чтобы начать и совершить транзакцию, дважды используя базу данных 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();
}
Сфера применения даже не проблема. Вы не можете открыть один и тот же файл базы данных дважды. В старых версиях Android вы рискуете повреждением и потерей данных. В новых версиях вы получите исключение. Если приведенный выше код работает для вас, то ваш базовый класс Dao, похоже, кэширует соединение с базой данных. Это то, что делает SqliteOpenHelper внутри. – tiguchi
Я использую один и тот же SqliteOpenHelper в каждом базовом классе Dao, поэтому файл базы данных не будет открыт дважды. – sockeqwe