如果有人卸载并清除所有数据,onUpgrade() 如何工作?

我使用 SQLite 作为数据库开发了一个 android 应用程序有几天了。有时我不得不添加列。出于这个原因,我只是更改数据库版本并像这样写下 onUpgrade() 中的更改:

{
  "semi": false,"singleQuote": true,"overrides": [
    {
      "files": "src/**/*.json","options": {
        "parser": "json-stringify"
      }
    },{
      "files": "src/path/to/folder/**/*.json","options": {
        "parser": "json-minify"// Some parser perhaps?
      }
    }
  ]
}

它适用于应用仍安装在移动设备上的情况。但是当应用程序之前没有安装或卸载并清除所有数据和缓存时,它会显示错误。因为在检查版本时,它只有一个版本。如何解决这个问题?

Jocelynsun 回答:如果有人卸载并清除所有数据,onUpgrade() 如何工作?

您的 onCreate() 应该设置一个适合您当前数据库版本的新数据库。 onUpgrade() 仅在有旧版本的数据库文件时才会调用。

,

我建议您阅读此 SQLite 以了解如何设置数据库。

来自文档: 你有这个 DbHelper 并且你有这些覆盖:

onCreate

在第一次创建数据库时调用。这是应该创建表和初始填充表的地方。

onUpgrade

当数据库需要升级时调用。实现应使用此方法删除表、添加表或执行升级到新架构版本所需的任何其他操作。

onDowngrade

当数据库需要降级时调用。这与 onUpgrade(SQLiteDatabase,int,int) 方法非常相似,但只要当前版本比请求的版本更新就会调用。但是,该方法不是抽象的,因此不是客户必须实现的。如果没有被覆盖,默认实现将拒绝降级并抛出 SQLiteException

有了这些方法你就没事了,不用担心旧版本和新版本。

class FeedReaderDbHelper(context: Context) : SQLiteOpenHelper(context,DATABASE_NAME,null,DATABASE_VERSION) {
    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL(SQL_CREATE_ENTRIES)
    }
    override fun onUpgrade(db: SQLiteDatabase,oldVersion: Int,newVersion: Int) {
        // This database is only a cache for online data,so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES)
        onCreate(db)
    }
    override fun onDowngrade(db: SQLiteDatabase,newVersion: Int) {
        onUpgrade(db,oldVersion,newVersion)
    }
    companion object {
        // If you change the database schema,you must increment the database version.
        const val DATABASE_VERSION = 1
        const val DATABASE_NAME = "FeedReader.db"
    }
}
,

onCreate() 方法中,您必须具有创建表的代码,因为您希望它们位于最新版本的数据库中。

所以当你部署第一个版本时,它看起来像:

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_EMPLOYEE_TABLE = "CREATE TABLE " + 
        TABLE_EMPLOYEE + " ("+ 
        COLUMN_ID + " INTEGER PRIMARY KEY," + 
        COLUMN_EMPLOYEE_NAME + " TEXT)";
    db.execSQL(CREATE_EMPLOYEE_TABLE);
}

但是在第二个版本中,由于您在表中引入了一个新列,它应该是这样的:

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_INPUT_TABLE = "CREATE TABLE " + 
        TABLE_EMPLOYEE + " ("+ 
        COLUMN_ID + " INTEGER PRIMARY KEY," + 
        COLUMN_EMPLOYEE_NAME + " TEXT," +
        COLUMN_EMPLOYEE_MOBILE + " TEXT)"; // new column
    db.execSQL(CREATE_INPUT_TABLE);
}

只有在没有安装数据库的情况下才会调用 onCreate() 方法。

所以,当你部署数据库的第二个版本时,如果用户已经安装了第一个版本并且旧的数据库还在,那么onCreate()被调用但是{ {1}} 将使用您在问题中的代码调用,并将更改现有表格。

如果用户决定卸载第一个版本,然后安装第二个版本,那么 onUpgrade() 将被调用,因为没有安装数据库,它将创建您想要的表那个版本。

并非如此,当用户安装应用程序时,不会自动调用 onCreate()onCreate()
它们在第一次调用 onUpgrade()getReadableDatabase() 时被调用。

本文链接:https://www.f2er.com/237535.html

大家都在问