2014-01-04 3 views
0

Я использую транзакции для вставки записей в мою базу данных. Не могли бы вы рассказать мне, является ли это правильным способом получить полную вставленную запись (возврат по номеру)? Кроме того, в приведенном ниже коде, если какая-либо вставка терпит неудачу, продолжит ли она следующую вставку или выйдет (я не использовал endTransaction в блоке Catch)?SQLITE Сделки: get total count

int numrow = 0; 
try{ 
      db.beginTransaction(); 
      for(mylibman cn : insertlist){ 
       ContentValues values = new ContentValues(); 
       values.put(KEY_LIBID, cn.getLibid()); 
       values.put(KEY_NAME, cn.getBookname()); 
       db.insertWithOnConflict(TABLE_NAME, null, values,SQLiteDatabase.CONFLICT_IGNORE); 
       numrow++; 
      } 
      db.setTransactionSuccessful(); 
     }catch (Exception e) { 

     } finally { 
      db.endTransaction(); 
     } 
     return numrow; 
+0

см. Мой ответ! :) – Hardik

ответ

0

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

insertWithOnConflict Возвращает идентификатор вставленной записи, или -1, так что вы должны проверить, что:

if (db.insertWithOnConflict(TABLE_NAME, null, values, 
          SQLiteDatabase.CONFLICT_IGNORE) != -1) 
    numrow++; 

insertWithOnConflict функция не бросает исключение, если запись не вставлена ​​из-за конфликт. Тем не менее, он будет throw, если есть другая ошибка, например неизвестное имя столбца или база данных только для чтения.

Вы не должны слепо игнорировать исключения; просто использовать try/finally:

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

вы должны проверить, как этот

int numrow = 0; 
    try{ 
       db.beginTransaction(); 
       for(mylibman cn : insertlist){ 
        ContentValues values = new ContentValues(); 
        values.put(KEY_LIBID, cn.getLibid()); 
        values.put(KEY_NAME, cn.getBookname()); 
        //do like this 
        long insertedId=db.insertWithOnConflict(TABLE_NAME, null, values,SQLiteDatabase.CONFLICT_IGNORE); 
        if(insertedId!=-1) 
        { 
          numrow++; 

        } 

       } 
       db.setTransactionSuccessful(); 
      }catch (Exception e) { 

      } finally { 
       db.endTransaction(); 
      } 
      return numrow; 
0

Non ответов отражают здесь документацию: «возвращается: строка ID вновь вставленной строки ИЛИ первичного ключом существующей строки, если входные пары 'conflictAlgorithm' = CONFLICT_IGNORE ИЛИ -1, если какая-либо ошибка "

Поскольку автор хочет знать« вставленные »столбцы, оба ответа неверны. Число вставленных строк может быть 0, поскольку они уже существуют. Однако «CONFLICT_IGNORE» сделает вставку возвратом существующего первичного ключа, поэтому числовое значение будет строками, которые вы пытались «вставить и не сработало», но не вставлены в строки ».

Возможно, вам придется использовать флаг «SQLiteDatabase.CONFLICT_ABORT» или «SQLiteDatabase.CONFLICT_FAIL» в зависимости от того, что и как вы вставляете.

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insertWithOnConflict%28java.lang.String,%20java.lang.String,%20android.content.ContentValues,%20int%29