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

相关文章:

android - 如果 GoogleApiClient 断开连接,OnDataPointListener 不会得到回调

c - 什么是学习数据库设计的好开源数据库? (设计 DBMS,而不是规范化表/等)

database - 在黑莓中从 sqlite 获取数据非常慢

java - SQLite onUpgrade() 挫败感

android - 如何为其项目填充具有两种不同布局的 CustomListView?

java - 在 Mac OSX 上为 OpenCV 编译 Android JNI

Android Sqlite 数据库设置问题

Android SQlite 不更新数据

java - 如何使用MediaScannerConnection扫描文件?

java - 如何从数据库表中删除特定项目?