2017-07-27 94 views
0

我需要升级我的android数据库,新版本是2,并在我的应用程序中调用SQLiteOpenHelper的onUpgrade()。但似乎数据库没有变化。我的操作删除一列并为Student表添加一个新列。android sqlite db onUpgrade失败的SQL执行,但没有变化

升级前,学生有(_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

嗨Jamling Li,你能告诉我们onUpdate()方法吗? – KeLiuyue

+0

使用'beginTransaction(); ...... endTransaction();'将无效。您需要编写**'setTransactionSuccessful()'**来表示在'endTransaction();之前应该提交事务(即更改是OK);' – MikeT

回答

0

使用beginTransaction .... endTransaction没有setTransactionSuccessfulendTransaction前后beginTransaction)将不会提交更改,因此什么都不做的价值。

因此,您应该实施使用setTransactionSuccessful例如,将您的代码更改为: -

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

当您遇到评论

//这里我执行PRAGMA TABLE_INFO(student);它返回空。 所以sql被执行。

升级后,除外学生有列(删除_age并添加_address列)(_phone,_name,_id,_address) ;

虽然混乱,但希望不是现在,这说明你的代码的工作原理(dropTable没有出现下降的表(但是,如果没有setTransactionSuccessful松开了由于endTransaction)。因此,可以得出结论,你实际上只需要一个单一的交易,所以你的代码可能是: -

db.beginTransaction(); 
    db.execSQL(createTempTable); 
    db.execSQL(insertTempTable); 
    db.execSQL(dropTable); 
    db.execSQL(createTable); 
    db.execSQL(insertTable); 
    db.execSQL(dropTempTable); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 

说,我会亲自降低原来的表之前引入一些检查,所以原来的重命名表(,例如新的行计数与原始的列计数和临时的列计数相对于新的的列计数)的行数而不是下降。

+0

谢谢〜它适合我! –

0

也许我错了,但我认为你不想删除一列并保留所有其他信息。我会建议你使用ALTER TABLE。

ALTER TABLE student DROP COLUMN _age, ADD _address TEXT; 
+0

感谢您的回复。alter table不能删除列,所以我创建了一个临时表来存储保存的数据 –

+0

真的吗?当我回家时我必须再试一次。不能真的相信它不能删除列。它在MySQL和SQL参考手册中,因此它应该可以工作。 – CodeRed

+0

这里是[ALTER_TABLE](http://www.sqlite.org/lang_altertable.html)的链接,我会尝试官方建议再次升级。 –