Android:我的create table语句出了什么问题?

时间:2019-01-13 14:06:27

标签: android sqlite create-table

我的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已经存在?

2 个答案:

答案 0 :(得分:1)

来自https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#execSQL(java.lang.String)

  

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 :从手机“应用信息”屏幕中清除应用数据。