Android SQLite-onUpgrade()添加列不起作用
您好,我想将我的数据库更新为版本2,但在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
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?。阿利乌杜德比!!休息的时间很短。这是一个移民委员会。陈