Откат Android sqlite - PullRequest
       0

Откат Android sqlite

12 голосов
/ 02 августа 2011

Я делаю синхронизацию базы данных. Загрузка данных между sql-сервером и sqlite. Если при обновлении / вставке записей в sqlite возникают некоторые обстоятельства, подключение к Интернету замедляется или прерывается, то необходимо выполнить откат. Это возможно в этом коде или Как использовать транзакцию здесь.

 public void insertTableRecords(String strTableName, String[] strToFields, String[] strValues){
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(DownlaodTableActivity.this);
    dbAdapter.openDataBase();
    ContentValues initialValues = new ContentValues();
    for(int i=0 ;i<strToFields.length;i++){
        initialValues.put(strToFields[i],strValues[i]);
    }
    long n = dbAdapter.insertRecordsInDB(strTableName, null, initialValues);
    System.out.println( " -- inserted status : --- " + n);
}

Пожалуйста, помогите мне.

Заранее спасибо ...

Ответы [ 3 ]

39 голосов
/ 02 августа 2011

Вот краткий пример использования транзакций в SQLite (в следующем примере db - это экземпляр SQLiteDatabase):

try {
    db.beginTransaction();
    // your sql stuff
    db.setTransactionSuccessful();
} catch(SQLException e) {
    // do some error handling
} finally {
   db.endTransaction();
}

Обратите внимание, важно, чтобы любой выбранный вами метод заменял "// ваши sql вещи" на броски и исключения. Используйте insertOrThrow () или если вам нужно больше гибкости экземпляров SQLiteStatement (их методы .execute всегда выдают исключения при ошибке).

Обратите внимание, вам не нужно явно выполнять откат. Если вы вызовете db.endTransaction () без .setTransactionSuccessful (), он автоматически откатится.

Только не забывайте всегда ставить setTransactionSuccessful после ваших последних методов броска SQLException:)

Вы можете легко расширить это с помощью другого блока catch, чтобы перехватывать исключения для тайм-аутов сети.

0 голосов
/ 02 августа 2011

Если вы имеете в виду откат, удаление добавленных строк; это довольно просто ... Вы можете добавить TIMESTAMP к каждой добавленной строке и установить ее значение на System.currentTimeMillis() ... Сохранить первый System.currentTimeMillis() и, если вы хотите откатить, вы можете DELETE из таблицы все строки добавлено после отметки времени, сохраненной в вашей программе


Кажется, вы обновляете таблицу только после того, как у вас есть одна полная строка ... Вот код, который поможет вам определить, подключен ли телефон к сети, и, соответственно, вы можете продолжить извлечение строк или нет.


manifest

Проверьте, подключено ли, и продолжайте

ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = conManager.getActiveNetworkInfo();
if(networkInfo.isConnected()){
    //YOUR CODE
}

0 голосов
/ 02 августа 2011

Эта вставка влияет только на одну таблицу. Итак, проверив переменную n, вы можете узнать, вставлены данные или нет. Между ними нет ничего. Никакой транзакции здесь не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...