android sqlite db onUpgrade失败了sql执行但没有改变

时间:2017-07-27 01:36:41

标签: android sqlite android-sqlite

我需要升级我的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();

2 个答案:

答案 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对抗新的列数。)