如何解决如果有人卸载并清除所有数据,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?
}
}
]
}
它适用于应用仍安装在移动设备上的情况。但是当应用程序之前没有安装或卸载并清除所有数据和缓存时,它会显示错误。因为在检查版本时,它只有一个版本。如何解决这个问题?
解决方法
您的 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()
时被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。