Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:我的CREATETABLE语句有什么问题?_Android_Sqlite_Create Table - Fatal编程技术网

Android:我的CREATETABLE语句有什么问题?

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

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 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语句。如果是这样的话,我会在某个地方预料到一个错误,也许像这样的东西不能传递多个语句。声明被删除。无论如何,谢谢你!!