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

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/49858926/

相关文章:

android - 在不使用 C++ 的情况下使用 Unity 或 Java 在 Vuforia 中进行图像检测

Android 省电模式监听器?

postgresql - 我可以在连接后定义 DBIx::Class::ResultSource::View 吗?

android - 使用字符串值Android更新时出现sqlite语法错误

android - SQLite 在 Android 上执行哪些类型的缓存?

java - 无法使用 Intent.ACTION_VIEW 在 Android 上打开 excel 文件

安卓 4.3 : BLE: Filtering behaviour of startLeScan()

android - 如何获取Android中的所有列?

java - CursorAdapter 检索数据时无提示地失败

Android:尝试编写只读数据库