我已在 SQLiteOpenHelper
onCreate()
中创建了表,但收到了
SQLiteException: no such table
或
SQLiteException: no such column
错误。为什么?
NOTE:
(This is the amalgamated summary of tens of similar questions every week. Attempting to provide a "canonical" community wiki question/answer here so that all those questions can be directed to a good reference.)
最佳答案
SQLiteOpenHelper
onCreate()
和 onUpgrade()
回调在数据库实际打开时调用,例如通过调用 getWritableDatabase()
。创建数据库帮助程序对象本身时,不会打开数据库。
SQLiteOpenHelper
数据库文件的版本。版本号是int
参数传递给constructor 。在数据库文件中,版本号存储在 PRAGMA user_version
中。 .
onCreate()
仅当数据库文件不存在且刚刚创建时运行。如果onCreate()
成功返回(不抛出异常),假设数据库是使用请求的版本号创建的。这意味着,您不应该捕获 SQLException
位于onCreate()
你自己。
onUpgrade()
仅当数据库文件存在但存储的版本号低于构造函数中请求的版本号时才调用。 onUpgrade()
应将表架构更新为请求的版本。
在代码 ( onCreate()
) 中更改表架构时,应确保数据库已更新。两种主要方法:
删除旧数据库文件,以便
onCreate()
再次运行。这在开发时通常是首选,因为您可以控制已安装的版本并且数据丢失不是问题。删除数据库文件的一些方法:卸载应用程序。使用应用程序管理器或
adb uninstall your.package.name
从外壳中取出。清除应用程序数据。使用应用程序管理器。
增加数据库版本,以便
onUpgrade()
被调用。这稍微复杂一些,因为需要更多代码。对于数据丢失不成问题的开发时架构升级,您可以使用
execSQL("DROP TABLE IF EXISTS <tablename>")
删除现有的表并调用onCreate()
重新创建数据库。对于已发布的版本,您应该在
onUpgrade()
中实现数据迁移这样您的用户就不会丢失数据。
关于android - SQLiteOpenHelper onCreate()/onUpgrade() 何时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132456/