我正在尝试为我的Android应用程序实现数据库升级。我尝试使用以下代码:
// Create a table that is equivalent to the existing one but with one column as TEXT instead of INTEGER
db.execSQL("CREATE VIRTUAL TABLE distributors_new USING FTS3 (fname TEXT, lname TEXT, phoneNumber TEXT, email TEXT, notes TEXT, parentid INTEGER, customid TEXT FOREIGN KEY (parentid) REFERENCES distributors(rowid) ON DELETE CASCADE ON UPDATE CASCADE);");
//Insert all data from the old table to the new one.
db.execSQL("INSERT INTO distributors_new SELECT * FROM distributors;");
// Drop the old table
db.execSQL("DROP TABLE distributors;");
// Rename the new table
db.execSQL("ALTER TABLE distributors_new RENAME TO distributors;");
但是在执行onUpgrade方法后出现错误。
02-12 16:31:16.324: ERROR/Database(1456): Failure 1 (SQL logic error or missing database) on 0x26b338 when executing 'COMMIT;'
02-12 16:31:16.334: ERROR/SQLiteOpenHelper(1456): Couldn't open mlmDB for writing (will try read-only):
02-12 16:31:16.334: ERROR/SQLiteOpenHelper(1456): android.database.sqlite.SQLiteException: SQL logic error or missing database: COMMIT;
02-12 16:31:16.334: ERROR/SQLiteOpenHelper(1456)
我做错了什么?
答案 0 :(得分:1)
我不是SQL的专家,但在我看来,你没有连接到数据库服务器,或者你没有你认为的特权级别。
答案 1 :(得分:1)
我添加了
db.beginTransaction();
// Code
db.endTransaction();
现在它似乎有效。
答案 2 :(得分:1)
有,AFAIK,没有理由这样做。 Sqlite使用dynamic typing,因此创建表时的数据类型并不重要。它只影响类型亲和力,请检查链接文档。
答案 3 :(得分:0)
失败可能是由于'将'置'到非NULL列'。