android - SQLiteOpenHelper onCreate()/onUpgrade() 何时运行?

标签 android sqlite android-sqlite sqlexception sqliteopenhelper

我已在 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() ) 中更改表架构时,应确保数据库已更新。两种主要方法:

  1. 删除旧数据库文件,以便 onCreate()再次运行。这在开发时通常是首选,因为您可以控制已安装的版本并且数据丢失不是问题。删除数据库文件的一些方法:

    • 卸载应用程序。使用应用程序管理器或 adb uninstall your.package.name从外壳中取出。

    • 清除应用程序数据。使用应用程序管理器。

  2. 增加数据库版本,以便 onUpgrade()被调用。这稍微复杂一些,因为需要更多代码。

    • 对于数据丢失不成问题的开发时架构升级,您可以使用 execSQL("DROP TABLE IF EXISTS <tablename>")删除现有的表并调用 onCreate()重新创建数据库。

    • 对于已发布的版本,您应该在 onUpgrade() 中实现数据迁移这样您的用户就不会丢失数据。

关于android - SQLiteOpenHelper onCreate()/onUpgrade() 何时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35686861/

相关文章:

android - 测试时不要在模拟器上看到横幅广告。错误: Ad failed to load : 3

java - 无法解析方法 setGroup

android - Jetpack Compose TextField InputFilter 仅具有货币正则表达式输入

ruby-on-rails - 未定义方法 `verified' 为 nil :NilClass

SQL选择具有唯一ID的不同

java - 尝试添加棉花糖权限支持时无法解析符号 'LocationService'

java - Glassfish SQLite 数据源

android - 使用 greendao 从两个表中选择多个列

android - 如何在android中使用sqlite数据库创建表?

android - 使用 run-as 从内部存储中检索数据库或任何其他文件