Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite-onUpgrade()添加列不起作用_Android_Sqlite_Kotlin_Android Sqlite - Fatal编程技术网

Android SQLite-onUpgrade()添加列不起作用

Android SQLite-onUpgrade()添加列不起作用,android,sqlite,kotlin,android-sqlite,Android,Sqlite,Kotlin,Android Sqlite,您好,我想将我的数据库更新为版本2,但在onUpgrade中,它不起作用,不会向我添加新列 因此,当我调用我的方法记录时,会显示以下错误消息: no such column: signature (code 1): , while compiling: UPDATE invoices SET signature=? WHERE id = ? 以下是我的部分代码: class InvoiceDatabase(context: Context) : SQLiteOpenHelper(context

您好,我想将我的数据库更新为版本2,但在onUpgrade中,它不起作用,不会向我添加新列

因此,当我调用我的方法记录时,会显示以下错误消息:

no such column: signature (code 1): , while compiling: UPDATE invoices SET signature=? WHERE id = ?
以下是我的部分代码:

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)
}
还有我的朋友:

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

}
我所称的方法:

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()
}
我所有的代码:

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

}

}
类InvoiceDatabase(上下文:context):SQLiteOpenHelper(上下文,数据库名称,null,数据库版本){
伴星{
私有const val数据库\u NAME:String=“invoice.db”
私有const val数据库_版本=2
私人成本表_NAME=“发票”//Les nom de la base de donnee
private const val COLUMN_ONE=“id”//COlonne UN,这是一个用手指触摸的sautoincrementer
private const val COLUMN_TWO=“customercodez”
private const val COLUMN_TREE=“idproducts”
“amountproducts”的private const val列
private const val COLUMN_FIVE=“折扣”
private const val COLUMN_SIX=“折扣类型”
private const val COLUMN_SEVEN=“日期”
private const val COLUMN_EIGHT=“签名”
private const val DATABASE\u ALTER\u SIGNATURE=“ALTER TABLE$TABLE\u NAME ADD COLUMN$COLUMN\u TEXT;”
}
/**
*关于creer la table SQLite
*/
重写onCreate(db:SQLiteDatabase?){
val query:String=“创建不存在的表${TABLE\u NAME}(”+
${COLUMN\u ONE}整数主键自动递增+
“${COLUMN_TWO}文本,”+
“${COLUMN_TREE}文本,”+
“${COLUMN\u FOR}文本,”+
“${COLUMN_FIVE}文本,”+
“${COLUMN_SIX}文本,”+
“${COLUMN_SEVEN}文本,”+
“${COLUMN_EIGHT}文本”+
");"
db?.execSQL(查询)
}
/**
*在插入式挑叶机上
*/
趣味插页(发票:发票){
val values=ContentValues()
value.put(第二列,invoice.customerCodeZ)
value.put(列树,invoice.idProducts)
values.put(发票.amountProducts的第_列)
价值.投入(第五列,发票.折扣)
价值.投入(第六列,发票.折扣类型)
价值。投入(第七列,发票日期)
val db:SQLiteDatabase=writeabledatabase
db.insert(表名称,null,值)
db.close()
}
/**
*关于bdd的补充条款
*/
乐趣删除(发票:发票){
val db:SQLiteDatabase=writeabledatabase
db.delete(表名,${COLUMN\u ONE}=?”,arrayOf(invoice.id.toString())
db.close()
}
/**
*关于修改lobjet de la BDD
*/
乐趣更新(发票:发票){
val values=ContentValues()
value.put(列树,invoice.idProducts)
values.put(发票.amountProducts的第_列)
价值.投入(第五列,发票.折扣)
价值.投入(第六列,发票.折扣类型)
val db:SQLiteDatabase=writeabledatabase
update(表名称,值,“${COLUMN\u ONE}=?”,arrayOf(invoice.id.toString()))
db.close()
}
发票签名(发票:发票){
val values=ContentValues()
values.put(第八列,发票.signatureBitmap)
val db:SQLiteDatabase=writeabledatabase
update(表名称,值,“${COLUMN\u ONE}=?”,arrayOf(invoice.id.toString()))
db.close()
}
/**
*关于《联合国诉讼法》中bdd条款的规定
*/
val retrieveAllData:ArrayList
得到(){
变量计数=0
val db=this.readableDatabase
val发票=ArrayList()
val result=db.rawQuery(“按${COLUMN\u ONE}DESC从${TABLE\u NAME}顺序选择*”,null)
while(result.moveToNext()){
发票。添加(计数、发票)(
result.getLong(result.getColumnIndex(COLUMN_TWO)),
result.getString(result.getColumnIndex(COLUMN_树)),
result.getString(result.getColumnIndex(COLUMN_FOR)),
result.getDouble(result.getColumnIndex(第五列)),
result.getString(result.getColumnIndex(第六列)),
result.getLong(result.getColumnIndex(第七列))
))
发票[count].id=result.getInt(result.getColumnIndex(第1列))
计数++
}
退回发票
}
重写更新(db:SQLiteDatabase?,旧版本:Int,新版本:Int){
何时(旧版){
1 -> {
db?.execSQL(数据库更改签名)
}
2 -> {
//将逻辑从版本2升级到版本3
}
3 -> {
//将逻辑从版本3升级到版本4
}
else->抛出IllegalStateException(“onUpgrade()和未知的oldVersion$oldVersion”);
}
}
}

首先,当db对象可以为null时,我会使用类似以下的方法:

db?.execSQL(DATABASE\u ALTER\u SIGNATURE),因为如果db为null,则不会执行任何代码,因此不会发生崩溃。但是用db!!。execSQL(数据库更改签名)繁荣


现在我看到DATABASE_VERSION=2,但您在版本1上执行alter table,我提供了java代码,用于在升级数据库后更新表中的一些字段。。 更改此代码

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

这里为定义所有ID设置一列值为零

   mNewDatabase.execSQL("UPDATE TableName SET columnName = 0  WHERE TableName IN ('10','21','58','63','66','69','78','89','91','92','95','96','97')");
如果要在表中添加任何列,请使用下面的alter命令

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

我不理解查询更新?为什么要这样做?放在哪里?我想你会在数据库升级时更新一些字段,或者在更新数据库后在表中添加一些列。根据你的问题表创建的问题或其他东西。没有任何效果,我更新了我的帖子。你能看一下我的代码吗?你想添加哪一列哪一表。对不起,我确认。。。您是否检查了oldVersion return 1?是的,因为当我放入数据库_VERSION=1并启动应用程序时,出现了一条错误消息,您无法从版本2降级到版本1。因此,对版本进行了更新,但列没有更新add@MickaelBelhassen蒙康塞勒苏尔db?。阿利乌杜德比!!休息的时间很短。这是一个移民委员会。陈