SQLiteDatabase.insertOrThrow не бросает, но не вставлены данные

Я пытаюсь ознакомиться с Android и его API баз данных. Я создал класс, который наследует от SQLiteOpenHelper, и вот как я создаю таблицу в базе данных

@Override public void onCreate(SQLiteDatabase db) { try { db.execSQL("CREATE TABLE " + FUELS_TABLE_NAME + " (" + "_ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "DATE_OF_FUELS DATE DEFAULT CURRENT_TIME," + "SELLER_POSITION TEXT DEFAULT 'unknown'," + "AMOUNT REAL" + ");" ); } catch (SQLException e) { Log.e(DATABASE_NAME, e.toString()); } } 

Функция, используемая для добавления данных в БД, следующая реализация в одном классе

 public void addNewFuel(float amount) { // Create the content to insert into the database ContentValues newEntry = new ContentValues(); newEntry.put("amount", amount); // Get database handler try { db = getWritableDatabase(); } catch (SQLException e) { Log.e(DATABASE_NAME, e.toString()); return; } // Begin transaction and insert data long returnedValue; db.beginTransaction(); try { returnedValue = db.insertOrThrow(FUELS_TABLE_NAME, null, newEntry); Log.v(DATABASE_NAME, "return value " + returnedValue); } catch (SQLException e) { Log.e(DATABASE_NAME, e.toString()); } finally { db.endTransaction(); } db.close(); } 

Но, по-видимому, данные не добавляются. ReturnValue всегда 1. Метод не бросает, и когда я вытаскиваю БД с помощью adb и смотрю, что контент полностью пуст.

Я просто не понимаю, что мне не хватает.

Любое предложение будет оценено по достоинству.

Спасибо, S

См. Ответ benritz для правильного решения. Этот ответ неверен, но я, к сожалению, не могу его удалить, так как это принятое сообщение.

/ ******* НЕ ПРАВИЛЬНО !!

Поскольку вы наследуете SQLiteOpenHelper, ваш вызов getWritableDatabase() уже запускает транзакцию БД. Из API SQLiteOpenHelper :

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

Таким образом, вам не нужно вызывать db.beginTransaction() и db.endTransaction() . Эти посторонние транзакционные вызовы вставляют ваши вставки. Я включил этот сценарий в свой проект и обнаружил, что тот же индекс (6 в моем случае) был возвращен при использовании этих методов транзакций. Когда я удаляю вызовы, я получаю желаемые результаты (вставлено несколько записей).

НЕ ВЕРНО!! ******* /

Ответ McStretch неверен. getWritableDatabase() не создает транзакцию для вашего кода, цитированная строка из документов относится к транзакциям, используемым для методов onCreate и onUpgrade, что означает, что вам не нужно добавлять код транзакции в эти методы. Вам еще нужно добавить код транзакции для любого другого метода, который требует транзакций.

Код emitrax работает некорректно, поскольку db.setTransactionSuccessful() не вызывается, что означает, что транзакция будет db.endTransaction() помощью db.endTransaction() .