SQLiteDatabase.insertOrThrow не выбрасывает, но данные не вставляются - PullRequest
5 голосов
/ 13 ноября 2010

Я пытаюсь познакомиться с 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

Ответы [ 2 ]

29 голосов
/ 13 декабря 2011

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

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

0 голосов
/ 13 ноября 2010

См. Ответ Бенрица для правильного решения. Этот ответ неправильный, но я, к сожалению, не могу удалить его, так как это принятый пост.

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

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

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

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

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

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