2013-12-17 3 views
0

Heloou, им пытаются сделать вложенную транзакцию, но бросает SqliteDatabaseLockedException, и я не знаю, почему ...Android, Вложенные транзакции не работает

метод источников данных с открытым() назначить базу данных Writable в их соответствующих атрибуты, чтобы позднее вызвать методы для управления данными. они оба используют SQLHelpder, чтобы вернуть записываемую базу данных.

@Override 
     protected Boolean doInBackground(String... url) { 

      try { 
       clientDataSource.open(); 
       movementDataSource.open(); 

       clientDataSource.getDatabase().beginTransaction(); 
       movementDataSource.getDatabase().beginTransaction(); 

       if(sendMovements()) { 
        movementDataSource.getDatabase().setTransactionSuccessful(); 
        clientDataSource.deleteAllClients(); 
       } 
       updateDatabase(url[0]); 
       clientDataSource.getDatabase().setTransactionSuccessful(); 
      } catch (JSONException e) { 
       //Treat Json Exception 
      } catch (IOException e) { 
       //Treat IOException 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      }finally { 
       movementDataSource.getDatabase().endTransaction(); 
       clientDataSource.getDatabase().endTransaction(); 
      } 

      return true; 
     } 
+0

какой внутри обновлениеDatabase способ? – Techfist

+0

Я извлекаю данные с сервера и вставляю новых клиентов в db –

+0

, которые db movementDataSource? – Techfist

ответ

0

Ну это образуют SQLITE документы, и вот что он говорит

Начинает транзакцию в монопольном режиме.

Сделки могут быть вложенными. Когда внешняя транзакция завершается, вся работа, выполненная в этой транзакции, и все вложенные транзакции будут совершены или отменены. Изменения будут отменены, если какая-либо транзакция будет завершена без маркировки как чистой (путем вызова setTransactionSuccessful). В противном случае они будут совершены.

Вот стандартная идиома для операций:

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 

так пункт, если вы не отметите свой конец транзакции после вызова его успешно, то это приведет к ошибке базы данных заблокирована, и в конечном итоге это то, что ваш делать.

движениеDataSource.getDatabase(). SetTransactionSuccessful(); // После того, как вы это вызвали, завершите эту транзакцию, иначе это приведет к ошибке блокировки базы данных.

+0

Я попытался закончить другую транзакцию, все еще дает мне ошибку блокировки –

+0

только для записи, БЕЗ методов транзакции, она работает Fine –

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