我的SQLiteOpenHelper的onCreate方法包含以下代码:
Log.d("mytag", "oncreate is called");
db.execSQL("CREATE TABLE TrainingSession (id INTEGER PRIMARY KEY, session_date TEXT, session_status TEXT)");
Log.d("mytag", "tables were created");
Logcat输出仅包含第一个Log.d:
oncreate is called
然后应用崩溃。我的create table语句有什么问题?
编辑:
Logcat实际上说表TrainingSession已经存在。但是,我的onUpgrade方法看起来像这样:
Log.d("mytag", "onupgrade is called");
db.execSQL("DROP TABLE IF EXISTS TrainingSet; DROP TABLE IF EXISTS TrainingSession;");
onCreate(db);
并且该方法的Logcat输出符合预期,该方法确实被调用:
onupgrade is called
如果调用了onUpgrade并删除了表,那么为什么onCreate表示TrainingSession已经存在?
答案 0 :(得分:1)
execSQL
在API级别1中添加了
public void execSQL(字符串sql)
执行 不是SELECT或其他任何SQL语句的单个SQL语句 返回数据。
..............................
参数sql字符串:
要执行的SQL语句。
多个 不支持使用分号分隔的语句。
所以execSql()
不支持多个以 ;
分隔的语句
因此,对每个语句分别执行多个execSql()
:
public static final String SQL_DELETE_TABLE1 = "DROP TABLE IF EXISTS TrainingSet"
db.execSQL(SQL_DELETE_TABLE1);
public static final String SQL_DELETE_TABLE2 = "DROP TABLE IF EXISTS TrainingSession"
db.execSQL(SQL_DELETE_TABLE2);
答案 1 :(得分:0)
如果查询可以,如果数据库结构已更改,则这些事情很可能发生。
尝试:
选项1 :添加其他sqlite数据库版本。
选项2 :删除数据库并重新创建。
选项3 :从手机“应用信息”屏幕中清除应用数据。