什么时候SQLiteOpenHelper onCreate()/ onUpgrade()运行?

什么时候SQLiteOpenHelper onCreate()/ onUpgrade()运行?

我已经在我的桌子上创建了我的桌子SQLiteOpenHelper onCreate()但收到了

SQLiteException: no such table

要么

SQLiteException: no such column

错误。为什么?


芜湖不芜
浏览 1491回答 5
5回答

Cats萌萌

SQLiteOpenHelper&nbsp;onCreate()而onUpgrade()当数据库实际上是打开,例如通过将呼叫回调调用getWritableDatabase()。创建数据库帮助程序对象本身时,不会打开数据库。SQLiteOpenHelper版本数据库文件。版本号是int传递给构造函数的参数。在数据库文件中,版本号存储在PRAGMA user_version。onCreate()仅在数据库文件不存在且刚刚创建时运行。如果onCreate()成功返回(不抛出异常),则假定使用请求的版本号创建数据库。作为一种暗示,你不应该自己SQLException陷入onCreate()困境。onUpgrade()仅在数据库文件存在时调用,但存储的版本号低于构造函数中请求的版本号。本onUpgrade()应更新表架构所需的版本。在代码(onCreate())中更改表模式时,应确保更新数据库。两种主要方法:删除旧的数据库文件,以便onCreate()再次运行。在开发时,您通常首选这种方法,您可以控制已安装的版本,并且数据丢失不是问题。删除数据库文件的一些方法:卸载应用程序。使用应用程序管理器或adb uninstall your.package.nameshell。清除申请数据。使用应用程序管理器。增加数据库版本以便onUpgrade()调用。由于需要更多代码,这稍微复杂一些。对于数据丢失不是问题的开发时模式升级,您可以使用execSQL("DROP TABLE IF EXISTS <tablename>")in来删除现有表并调用onCreate()以重新创建数据库。对于已发布的版本,您应该实施数据迁移,onUpgrade()以便用户不会丢失数据。

叮当猫咪

根据Jaskey的要求,在这里进一步添加缺失点数据库版本存储在SQLite数据库文件中。catch是构造函数SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)因此,当使用name(第二个参数)调用数据库帮助程序构造函数时,平台会检查数据库是否存在,如果数据库存在,它将从数据库文件头获取版本信息并触发正确的回调正如旧答案中已经解释的那样,如果名称的数据库不存在,则会触发onCreate。以下说明onUpgrade以一个例子说明了案例。比如说,你的第一个版本的应用程序有DatabaseHelper(扩展SQLiteOpenHelper)构造函数传递版本1,然后你提供了一个升级的应用程序,其新的源代码版本传递为2,然后在DatabaseHelper构造时自动,平台onUpgrade通过查看文件已经存在触发,但版本低于您通过的当前版本。现在假设您正在计划将db版本的应用程序的第三个版本作为3(只有在修改数据库模式时才增加db版本)。在这种增量升级中,您必须逐步编写每个版本的升级逻辑,以获得更好的可维护代码示例伪代码如下:@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {&nbsp; switch(oldVersion) {&nbsp; &nbsp; case 1:&nbsp; &nbsp; &nbsp; &nbsp;//upgrade logic from version 1 to 2&nbsp; &nbsp; case 2:&nbsp; &nbsp; &nbsp; &nbsp;//upgrade logic from version 2 to 3&nbsp; &nbsp; case 3:&nbsp; &nbsp; &nbsp; &nbsp;//upgrade logic from version 3 to 4&nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalStateException(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "onUpgrade() with unknown oldVersion " + oldVersion);&nbsp; }}注意break案例中的缺失语句1和2。这就是增量升级的意思。说,如果旧版本2和新版本4,那么逻辑将升级数据库2来3,然后到4如果旧版本3和新版本4,它只是运行升级的逻辑3来4

紫衣仙女

onCreate()当我们第一次创建DataBase(即数据库不存在)时,onCreate()使用传入的版本创建数据库SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)onCreate()方法是创建您定义的表并执行您编写的任何其他代码。但是,只有在应用程序的数据目录(/data/data/your.apps.classpath/databases)中缺少SQLite文件时,才会调用此方法。如果您已更改代码并在模拟器中重新启动,则不会调用此方法。如果要onCreate()运行,则需要使用adb删除SQLite数据库文件。onUpgrade()SQLiteOpenHelper&nbsp;应该调用超级构造函数。onUpgrade()仅当版本整数大于应用程序中运行的当前版本时,才会调用此方法。如果要onUpgrade()调用该方法,则需要在代码中增加版本号。

至尊宝的传说

可能是我来不及但是我想分享我的简短回答。请检查答案&nbsp;是否存在同样的问题。它一定会帮到你。没有更深入的规格。如果您对创建表的语法有信心,那么当您在同一个表中添加新列时可能会发生这种情况...1)从您的设备卸载并再次运行。要么2)设置 - > app - > ClearData要么3)更改DATABASE_VERSION“DatabaseHandler”类(如果添加了新列,则会自动升级)public&nbsp;DatabaseHandler(Context&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;DATABASE_NAME,&nbsp;null,&nbsp;DATABASE_VERSION);}要么4)改变DATABASE_NAME你的“DatabaseHandler”类(我遇到了同样的问题。但是我通过改变成功了DATABASE_NAME。)

犯罪嫌疑人X

扩展时要记住的要点&nbsp;SQLiteOpenHelpersuper(context, DBName, null, DBversion);&nbsp;- 应该调用第一行构造函数覆盖onCreate和onUpgrade(如果需要)onCreate只有当将被调用getWritableDatabase()或getReadableDatabase()执行。这只会DBName在第一步中指定的时间不可用时调用一次。您可以在onCreate方法上添加create table query每当您想要添加新表时,只需更改DBversion并在onUpgrade表中执行查询,或者只是卸载然后安装应用程序。
打开App,查看更多内容
随时随地看视频慕课网APP