Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLiteDatabase.insertOrThrow doesn't throw but not data is inserted

Tags:

android

sqlite

I'm trying to get familiar with Android and its database API. I've created a class that inherits from SQLiteOpenHelper and this is how I create the table in the database

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

The function used to add data to the DB is the following implemeneted within the same class is

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

but apparently no data is added. The returnValue is always 1. The method doesn't throw, and when I pull out the DB with adb and look at it's content is totally empty.

I just can't understand what I'm missing.

Any suggestion would be appreciated.

Thanks, S

like image 797
emitrax Avatar asked Nov 13 '10 15:11

emitrax


Video Answer


1 Answers

McStretch's answer is incorrect. getWritableDatabase() does not create a transaction for your code, the quoted line from the docs is referring to transactions being used for the onCreate and onUpgrade methods meaning that you don't need to add transaction code in those methods. You still need add transaction code for any other method that requires transactions.

emitrax's code is not working correctly as db.setTransactionSuccessful() is not being called which means the transaction will be rollbacked by db.endTransaction().

like image 103
benritz Avatar answered Oct 27 '22 05:10

benritz