Android:我的CREATETABLE语句有什么问题?
SQLiteOpenHelper的onCreate方法包含以下代码:Android:我的CREATETABLE语句有什么问题?,android,sqlite,create-table,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输出仅包含第一个日志。d: 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输出仅包含第一个日志。d:
oncreate is called
然后应用程序崩溃了。我的CREATETABLE语句有什么问题
编辑:
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已经存在呢?如果查询正常,那么如果数据库结构发生了变化,这些事情就会经常发生 尝试: 选项1:添加其他sqlite数据库版本 选项2:删除数据库并重新创建它 选项3:从手机应用程序信息屏幕清除应用程序数据 来自 在API级别1中添加了execSQL公共无效execSQL字符串sql Execute 不是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);
然后应用程序崩溃——使用Logcat检查与崩溃相关的Java堆栈跟踪:CREATE TABLE语句AFAIK没有任何问题。您可以尝试直接对SQLite运行它,以使自己相信它是正确的。你的代码中肯定还有其他问题。我实际上已经在我的firefox SQLite扩展中测试了create语句。它很好用。但为什么第二个输出没有生成呢?我不知道使用logcat检查java堆栈跟踪意味着什么,必须用谷歌搜索。好吧,很快:它说trainingsession已经存在。我将编辑我的问题以放大正在运行的代码的图片。我在上面添加了信息和代码。该表已经存在,但正如您从我的代码中看到的,他应该在重新创建表之前删除这些表。我知道,为了测试的目的,我在构造函数中调用getWritableDatabase。不过,你粗体的说法并不正确。如果数据库不存在,或者自onupgrade调用oncreate以来数据库版本增加,则调用oncreate。您可以从logcat输出中看到正在调用oncreate。所以请收回你的否决票,我没有否决。如果您的数据库版本增加,这将触发onUpgradeoh。我以为是您,对不起。是的,它触发了升级。它会删除表,或者不会删除,因为我遇到了这个错误-但我不知道为什么它不会,这是这里的问题,然后调用onCreate重新创建数据库。但是,在onCreate中,由于trainingsession已存在,应用程序崩溃!。但该表应该在onupgrade中删除,并且onupgrade确实会被调用,正如您在logcat中看到的那样。哦,我的上帝,非常感谢您:我开始觉得我永远无法解决这个问题,没有人知道出了什么问题。这就是问题的原因,现在一切都正常工作了!我决不会假设您不能在db.execSQL想要的字符串中传递多个SQL语句。如果是这样的话,我会在某个地方预料到一个错误,也许像这样的东西不能传递多个语句。声明被删除。无论如何,谢谢你!!