android - 更新应用程序后 SQlite“没有这样的表”
问题描述
我今天更新了我的应用程序,并开始在 crashlitics 中看到以下内容:
android.database.sqlite.SQLiteException: no such table: LESSONATTACHMENT (code 1 SQLITE_ERROR[1]): , while compiling: SELECT _THUMB_PATH FROM LESSONATTACHMENT WHERE _id = 2
我在我的内部创建了一个新表SQLiteOpenHelper
,在我更新之前它不在应用程序中。
这就是我创建表的方式:
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_LESSON_ATTACHMENTS);
}
我应该把它放进去OnUpgrade
吗?像这样:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(CREATE_TABLE_LESSON_ATTACHMENTS);
}
解决方案
您需要增加数据库版本并在 onUpgrade 中创建新表,并可能删除旧表。
您的数据库只创建一次。升级在 onUpgrade 函数中完成
您也可以删除数据库,它将使用新表创建新的,但这取决于您是否能够立即执行此操作。
例如,此代码会将您的数据库升级到当前版本
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
//Changes between version 1 and 2
case 2:
// Changes between Version 2 and 3
case currentversion:
//changes between last change and now
}
}
当您更新数据库时,只需在此下方放置一个带有新版本的新案例。这样您就可以维护每个版本的数据库,并确保它能够正确升级。重要的是,您不要在每个案例之后使用休息。
此代码显示例如我的一个数据库,当我增加版本时,我只需为旧版本添加一个新案例。当您尚未升级数据库时,请将新版本设置为比旧版本高 1,并为旧版本添加 case 子句。
public class database extends SQLiteOpenHelper {
private static String DATABASE = "Database";
private static int VERSION = 4;
public database(@Nullable Context context) {
super(context, DATABASE, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE DATABASE TABLE");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:
db.execSQL("CHANGES DONE AFTER VERSION 1");
case 2:
db.execSQL("CHANGES DONE AFTER VERSION 2");
case 3:
db.execSQL("CHANGES DONE AFTER VERSION 3");
}
}
推荐阅读
- easyphp - php7.2和php7.3下如何激活SSL和EasyPHP 17
- python - 别名 sqlalchemy.text 对象
- java - 使用参数字符串键删除双向链表中的节点?
- python - 将具有多行的 Pandas 数据框转换为一行
- node.js - 我应该使用全局变量在整个服务器上共享 socket.io 实例吗
- javascript - 过滤范围之间的数据
- vue.js - Vuejs Bind 1 复选框与多个
- pug - Thymeleaf:将字符串参数传递给 mixins 函数
- kotlin - launch 仅从 Kotlin 1.3 开始可用,不能在 Kotlin 1.2 中使用
- modx - MODX无法保存