2010-11-13 2 views
5

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

@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()); 
    } 
} 

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

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. Метод не бросает, и когда я вытаскиваю DB с помощью adb и смотрю, что контент полностью пуст.

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

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

Спасибо, S

ответ

-3

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

/******* НЕ ИСПРАВНО !!

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

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

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

НЕ ИСПРАВНО !! *******/

+1

спасибо. Теперь это работает. Мне действительно интересно, как это происходит, и почему вставка не бросается. Во всяком случае, большое спасибо! – emitrax

+0

Добро пожаловать. Я думаю, что исключение не выбрасывается, потому что нет ничего особенного в вашем заявлении insert, и вы не нарушаете никаких ограничений таблицы и т. Д. Вместо этого в нескольких транзакционных вызовах происходит замешательство. Мне нужно будет сделать еще несколько исследований, чтобы понять, почему вложенная транзакция ведет себя так, как она делает. Я понимаю, почему он ничего не вставлял, но тот факт, что id возвращается вообще, является нечетным. – McStretch

+5

Это действительно странно! Исходный код SQLiteOpenHelper, конечно же, не открывает никаких транзакций, кроме создания и обновления базы данных. Поэтому после вызова getWriteableDatabase() транзакции не активны для базы данных! Либо что-то действительно вяло, либо этот ответ фиктивный. – Nakedible

29

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

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

+1

Ну, это намного больше смысла. – Bilthon

+0

Ясно, что это правильный ответ, а не McStretch's. – lilbyrdie