我需要升级我的android数据库,新版本是2,并且在我的应用程序中调用了SQLiteOpenHelper的onUpgrade()。但似乎数据库没有变化。我的操作删除了一个列并为Student表添加了一个新列。
升级前,学生有(_phone,_name,_id,_age)四列;
升级后,例外学生的列(_phone,_name,_id,_address)为列(删除_age并添加_address列);
但是我失败了,最后的结果是学生结构没有改变。
String createTempTable = "CREATE TEMPORARY TABLE student_temp_1(_phone TEXT,_name TEXT,_id INTEGER PRIMARY KEY AUTOINCREMENT);";
String insertTempTable = "INSERT INTO student_temp_1 SELECT _phone,_name,_id FROM student;";
String dropTable = "DROP TABLE student";
String createTable = "CREATE TABLE student (_address TEXT,_phone TEXT,_name TEXT,_id INTEGER PRIMARY KEY AUTOINCREMENT);";
String insertTable = "INSERT INTO student(_phone,_name,_id) SELECT _phone,_name,_id FROM student_temp_1;";
String dropTempTable = "DROP TABLE student_temp_1;";
db.beginTransaction();
db.execSQL(createTempTable);
db.execSQL(insertTempTable);
db.execSQL(dropTable);
db.endTransaction();
// here I execute the PRAGMA TABLE_INFO(student); it returned empty. so the sql is executed.
db.beginTransaction();
db.execSQL(createTable);
db.execSQL(insertTable);
db.execSQL(dropTempTable);
db.endTransaction();
答案 0 :(得分:0)
也许我错了,但我认为你不想删除一列并保留所有其他信息。我建议你使用ALTER TABLE。
ALTER TABLE student DROP COLUMN _age, ADD _address TEXT;
答案 1 :(得分:0)
使用beginTransaction
.... endTransaction
而不是 setTransactionSuccessful
(在endTransaction
之前和{{1}之后} )不会提交更改,因此不会做任何有价值的事情。
因此,您应该实施 beginTransaction
的使用,例如将您的代码更改为: -
setTransactionSuccessful
正如您所经历的那样评论
//这里我执行PRAGMA TABLE_INFO(学生);它返回空了。 所以sql被执行了。
和
升级后,除外学生(_phone,_name,_id,_address) 对于列(删除_age并添加_address列);
虽然令人困惑,虽然现在不希望这样,但这表明你的代码原则上是有效的(即 db.beginTransaction();
db.execSQL(createTempTable);
db.execSQL(insertTempTable);
db.execSQL(dropTable);
db.setTransactionSuccessful(); //<<<<<<<<<<<<
db.endTransaction();
// here I execute the PRAGMA TABLE_INFO(student); it returned empty. so the sql is executed.
db.beginTransaction();
db.execSQL(createTable);
db.execSQL(insertTable);
db.execSQL(dropTempTable);
db.setTransactionSuccessful(); //<<<<<<<<<<<<
db.endTransaction();
似乎确实放弃了表格(但由于dropTable
而没有取消endTransaction
))。因此,您可以得出结论,您实际上只需要一个事务,因此您的代码可能是: -
setTransactionSuccessful
说我会在删除原始表之前亲自介绍一些检查,所以在检查之后重命名原始表而不是丢弃drop(例如,对于原始行数和列数的新行计数temp对抗新的列数。)