我已经在我的 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()
成功返回(不抛出异常),假定数据库是使用请求的版本号创建的。言外之意,你不应该 catch 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/49858926/