为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2019-05-21 13:32:17
什么时候SQLiteOpenHelper onCreate()/ onUpgrade()运行?我已经在我的桌子上创建了我的桌子SQLiteOpenHelper onCreate()但收到了SQLiteException: no such table要么SQLiteException: no such column错误。为什么?
查看完整描述

5 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

SQLiteOpenHelper onCreate()onUpgrade()当数据库实际上是打开,例如通过将呼叫回调调用getWritableDatabase()。创建数据库帮助程序对象本身时,不会打开数据库。

SQLiteOpenHelper版本数据库文件。版本号是int传递给构造函数的参数。在数据库文件中,版本号存储在PRAGMA user_version

onCreate()仅在数据库文件不存在且刚刚创建时运行。如果onCreate()成功返回(不抛出异常),则假定使用请求的版本号创建数据库。作为一种暗示,你不应该自己SQLException陷入onCreate()困境。

onUpgrade()仅在数据库文件存在时调用,但存储的版本号低于构造函数中请求的版本号。本onUpgrade()应更新表架构所需的版本。

在代码(onCreate())中更改表模式时,应确保更新数据库。两种主要方法:

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

    • 卸载应用程序。使用应用程序管理器或adb uninstall your.package.nameshell。

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

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

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

    • 对于已发布的版本,您应该实施数据迁移,onUpgrade()以便用户不会丢失数据。


查看完整回答
反对 回复 2019-05-21
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

根据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版本)。在这种增量升级中,您必须逐步编写每个版本的升级逻辑,以获得更好的可维护代码


示例伪代码如下:


@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  switch(oldVersion) {

    case 1:

       //upgrade logic from version 1 to 2

    case 2:

       //upgrade logic from version 2 to 3

    case 3:

       //upgrade logic from version 3 to 4

       break;

    default:

       throw new IllegalStateException(

                "onUpgrade() with unknown oldVersion " + oldVersion);

  }

}

注意break案例中的缺失语句1和2。这就是增量升级的意思。


说,如果旧版本2和新版本4,那么逻辑将升级数据库2来3,然后到4


如果旧版本3和新版本4,它只是运行升级的逻辑3来4


查看完整回答
反对 回复 2019-05-21
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

onCreate()

  1. 当我们第一次创建DataBase(即数据库不存在)时,onCreate()使用传入的版本创建数据库SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

  2. onCreate()方法是创建您定义的表并执行您编写的任何其他代码。但是,只有在应用程序的数据目录(/data/data/your.apps.classpath/databases)中缺少SQLite文件时,才会调用此方法。

  3. 如果您已更改代码并在模拟器中重新启动,则不会调用此方法。如果要onCreate()运行,则需要使用adb删除SQLite数据库文件。

onUpgrade()

  1. SQLiteOpenHelper 应该调用超级构造函数。

  2. onUpgrade()仅当版本整数大于应用程序中运行的当前版本时,才会调用此方法。

  3. 如果要onUpgrade()调用该方法,则需要在代码中增加版本号。


查看完整回答
反对 回复 2019-05-21
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

可能是我来不及但是我想分享我的简短回答。请检查答案 是否存在同样的问题。它一定会帮到你。没有更深入的规格。

如果您对创建表的语法有信心,那么当您在同一个表中添加新列时可能会发生这种情况...

1)从您的设备卸载并再次运行。

要么

2)设置 - > app - > ClearData

要么

3)更改DATABASE_VERSION“DatabaseHandler”类(如果添加了新列,则会自动升级)

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);}

要么

4)改变DATABASE_NAME你的“DatabaseHandler”类(我遇到了同样的问题。但是我通过改变成功了DATABASE_NAME。)


查看完整回答
反对 回复 2019-05-21
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

扩展时要记住的要点 SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); - 应该调用第一行构造函数

  2. 覆盖onCreateonUpgrade(如果需要)

  3. onCreate只有当将被调用getWritableDatabase()getReadableDatabase()执行。这只会DBName在第一步中指定的时间不可用时调用一次。您可以在onCreate方法上添加create table query

  4. 每当您想要添加新表时,只需更改DBversion并在onUpgrade表中执行查询,或者只是卸载然后安装应用程序。


查看完整回答
反对 回复 2019-05-21
  • 5 回答
  • 0 关注
  • 1490 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信