简体   繁体   中英

SQLite - onUpgrade() add column does not work

Hello I want to update my database to a version 2, but in the onUpgrade it does not work it does not add me new column.

So when I call on my method to record this puts me the following error message:

no such column: signature (code 1): , while compiling: UPDATE invoices SET signature=? WHERE id = ?

Here is part of my code:

class InvoiceDatabase(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

companion object {
    private const val DATABASE_NAME: String = "invoice.db"
    private const val DATABASE_VERSION = 2
    private const val TABLE_NAME = "invoices" //Les nom de la base de donnee
    private const val COLUMN_ONE = "id" //COlonne UN, c'est le ID qui va sautoincrementer on va pas trop le toucher
    private const val COLUMN_TWO = "customercodez"
    private const val COLUMN_TREE = "idproducts"
    private const val COLUMN_FOR = "amountproducts"
    private const val COLUMN_FIVE = "discount"
    private const val COLUMN_SIX = "discounttype"
    private const val COLUMN_SEVEN = "date"
    private const val COLUMN_EIGHT = "signature"

    private const val DATABASE_ALTER_SIGNATURE  = "ALTER TABLE $TABLE_NAME ADD COLUMN $COLUMN_EIGHT TEXT;"
}

/**
 * On creer la table SQLite
 */
override fun onCreate(db: SQLiteDatabase?) {
    val query: String = "CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (" +
            "${COLUMN_ONE} INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "${COLUMN_TWO} TEXT, " +
            "${COLUMN_TREE} TEXT, " +
            "${COLUMN_FOR} TEXT, " +
            "${COLUMN_FIVE} TEXT, " +
            "${COLUMN_SIX} TEXT, " +
            "${COLUMN_SEVEN} TEXT" +
            ");"

    db?.execSQL(query)
}

and my onUpgrade:

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    when (oldVersion) {
        1 -> {
            db!!.execSQL(DATABASE_ALTER_SIGNATURE)
        }
        2 -> {
            //upgrade logic from version 2 to 3
        }
        3 -> {
            //upgrade logic from version 3 to 4
        }
        else -> throw IllegalStateException("onUpgrade() with unknown oldVersion $oldVersion");
    }

}

The methode i called:

fun addSignature(invoice: Invoice) {
    val values = ContentValues()

    values.put(COLUMN_EIGHT, invoice.signatureBitmap)

    val db: SQLiteDatabase = writableDatabase
    db.update(TABLE_NAME, values, "${COLUMN_ONE} = ?", arrayOf(invoice.id.toString()))
    db.close()
}

all my code:

class InvoiceDatabase(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

companion object {
    private const val DATABASE_NAME: String = "invoice.db"
    private const val DATABASE_VERSION = 2
    private const val TABLE_NAME = "invoices" //Les nom de la base de donnee
    private const val COLUMN_ONE = "id" //COlonne UN, c'est le ID qui va sautoincrementer on va pas trop le toucher
    private const val COLUMN_TWO = "customercodez"
    private const val COLUMN_TREE = "idproducts"
    private const val COLUMN_FOR = "amountproducts"
    private const val COLUMN_FIVE = "discount"
    private const val COLUMN_SIX = "discounttype"
    private const val COLUMN_SEVEN = "date"
    private const val COLUMN_EIGHT = "signature"

    private const val DATABASE_ALTER_SIGNATURE  = "ALTER TABLE $TABLE_NAME ADD COLUMN $COLUMN_EIGHT TEXT;"
}

/**
 * On creer la table SQLite
 */
override fun onCreate(db: SQLiteDatabase?) {
    val query: String = "CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (" +
            "${COLUMN_ONE} INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "${COLUMN_TWO} TEXT, " +
            "${COLUMN_TREE} TEXT, " +
            "${COLUMN_FOR} TEXT, " +
            "${COLUMN_FIVE} TEXT, " +
            "${COLUMN_SIX} TEXT, " +
            "${COLUMN_SEVEN} TEXT, " +
            "${COLUMN_EIGHT} TEXT" +
            ");"

    db?.execSQL(query)
}

/**
 * On insert lobjet creer dans la BDD
 */
fun insert(invoice: Invoice) {
    val values = ContentValues()

    values.put(COLUMN_TWO, invoice.customerCodeZ)
    values.put(COLUMN_TREE, invoice.idProducts)
    values.put(COLUMN_FOR, invoice.amountProducts)
    values.put(COLUMN_FIVE, invoice.discount)
    values.put(COLUMN_SIX, invoice.discountType)
    values.put(COLUMN_SEVEN, invoice.date)

    val db: SQLiteDatabase = writableDatabase
    db.insert(TABLE_NAME, null, values)
    db.close()
}


/**
 * On Supprime l'objet de la bdd
 */
fun delete(invoice: Invoice) {
    val db: SQLiteDatabase = writableDatabase
    db.delete(TABLE_NAME, "${COLUMN_ONE} = ?", arrayOf(invoice.id.toString()))
    db.close()
}

/**
 * On modifie lobjet de la BDD
 */
fun update(invoice: Invoice) {
    val values = ContentValues()

    values.put(COLUMN_TREE, invoice.idProducts)
    values.put(COLUMN_FOR, invoice.amountProducts)
    values.put(COLUMN_FIVE, invoice.discount)
    values.put(COLUMN_SIX, invoice.discountType)

    val db: SQLiteDatabase = writableDatabase
    db.update(TABLE_NAME, values, "${COLUMN_ONE} = ?", arrayOf(invoice.id.toString()))
    db.close()
}

fun addSignature(invoice: Invoice) {
    val values = ContentValues()

    values.put(COLUMN_EIGHT, invoice.signatureBitmap)

    val db: SQLiteDatabase = writableDatabase
    db.update(TABLE_NAME, values, "${COLUMN_ONE} = ?", arrayOf(invoice.id.toString()))
    db.close()
}

/**
 * On recuperer toute les donnees de la bdd dans un arrayList
 */
val retrieveAllData: ArrayList<Invoice>
    get() {
        var count = 0

        val db = this.readableDatabase
        val invoices = ArrayList<Invoice>()

        val result = db.rawQuery("SELECT * FROM ${TABLE_NAME} ORDER BY ${COLUMN_ONE} DESC", null)

        while (result.moveToNext()) {
            invoices.add(count, Invoice(
                    result.getLong(result.getColumnIndex(COLUMN_TWO)),
                    result.getString(result.getColumnIndex(COLUMN_TREE)),
                    result.getString(result.getColumnIndex(COLUMN_FOR)),
                    result.getDouble(result.getColumnIndex(COLUMN_FIVE)),
                    result.getString(result.getColumnIndex(COLUMN_SIX)),
                    result.getLong(result.getColumnIndex(COLUMN_SEVEN))
            ))

            invoices[count].id = result.getInt(result.getColumnIndex(COLUMN_ONE))
            count++
        }

        return invoices
    }



override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    when (oldVersion) {
        1 -> {
            db?.execSQL(DATABASE_ALTER_SIGNATURE)
        }
        2 -> {
            //upgrade logic from version 2 to 3
        }
        3 -> {
            //upgrade logic from version 3 to 4
        }
        else -> throw IllegalStateException("onUpgrade() with unknown oldVersion $oldVersion");
    }

}

}

first when db object can be null, I would use somethink like :

db?.execSQL(DATABASE_ALTER_SIGNATURE) because with that, if db is null no code is executed so no crash. But with db!!.execSQL(DATABASE_ALTER_SIGNATURE) boom!!!

and now I see DATABASE_VERSION = 2 but you execute your alter table on version 1

I provide java code for update some fields in table after upgrade database .. change this code ..

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
when (newVersion) {
    1 -> {
        db!!.execSQL(DATABASE_ALTER_SIGNATURE)
    }
    2 -> {
        getWriteDatabase();
    mNewDatabase.execSQL("ALTER TABLE TabelName ADD COLUMN COLUMN_EIGHT TEXT");
    }
    3 -> {
        //upgrade logic from version 3 to 4
    }
    else -> throw IllegalStateException("onUpgrade() with unknown oldVersion $oldVersion");
}

}

Here set one column value as zero for define all ids.

   mNewDatabase.execSQL("UPDATE TableName SET columnName = 0  WHERE TableName IN ('10','21','58','63','66','69','78','89','91','92','95','96','97')");

and if you want to add any column in the table then used alter command like below ..

mNewDatabase.execSQL("ALTER TABLE TabelName ADD COLUMN isActive INTEGER DEFAULT 1");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM