|
|
|
|
@ -66,11 +66,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
/**
|
|
|
|
|
* 数据库版本号
|
|
|
|
|
* <p>
|
|
|
|
|
* 当前数据库版本为5,用于跟踪数据库结构变更。
|
|
|
|
|
* 当前数据库版本为8,用于跟踪数据库结构变更。
|
|
|
|
|
* 当数据库版本变更时,onUpgrade方法会被调用以执行升级逻辑。
|
|
|
|
|
* </p>
|
|
|
|
|
*/
|
|
|
|
|
private static final int DB_VERSION = 5;
|
|
|
|
|
private static final int DB_VERSION = 8;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 数据库表名常量接口
|
|
|
|
|
@ -155,7 +155,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
|
|
|
|
|
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
|
|
|
|
|
NoteColumns.TOP + " INTEGER NOT NULL DEFAULT 0," +
|
|
|
|
|
NoteColumns.LOCKED + " INTEGER NOT NULL DEFAULT 0" +
|
|
|
|
|
NoteColumns.LOCKED + " INTEGER NOT NULL DEFAULT 0," +
|
|
|
|
|
NoteColumns.TITLE + " TEXT NOT NULL DEFAULT ''" +
|
|
|
|
|
")";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -511,51 +512,51 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
boolean reCreateTriggers = false;
|
|
|
|
|
boolean skipV2 = false;
|
|
|
|
|
|
|
|
|
|
// 使用 while 循环逐步升级到目标版本
|
|
|
|
|
while (oldVersion < newVersion) {
|
|
|
|
|
switch (oldVersion) {
|
|
|
|
|
case 1:
|
|
|
|
|
// 从V1升级到V2(包括V2到V3)
|
|
|
|
|
upgradeToV2(db);
|
|
|
|
|
skipV2 = true;
|
|
|
|
|
oldVersion = 2;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
|
// 从V2升级到V3(如果未被V2升级包含)
|
|
|
|
|
if (!skipV2) {
|
|
|
|
|
upgradeToV3(db);
|
|
|
|
|
reCreateTriggers = true;
|
|
|
|
|
}
|
|
|
|
|
oldVersion = 3;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
|
// 从V3升级到V4
|
|
|
|
|
upgradeToV4(db);
|
|
|
|
|
oldVersion = 4;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 4:
|
|
|
|
|
// 从V4升级到V5
|
|
|
|
|
upgradeToV5(db);
|
|
|
|
|
oldVersion = 5;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
|
// 从V5升级到V6(仅在需要时)
|
|
|
|
|
if (newVersion > 5) {
|
|
|
|
|
upgradeToV6(db);
|
|
|
|
|
}
|
|
|
|
|
oldVersion = 6;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
// 如果遇到未知版本,直接跳到目标版本
|
|
|
|
|
Log.w(TAG, "Unknown database version: " + oldVersion + ", skipping to " + newVersion);
|
|
|
|
|
oldVersion = newVersion;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// 从V1升级到V2(包括V2到V3)
|
|
|
|
|
if (oldVersion == 1) {
|
|
|
|
|
upgradeToV2(db);
|
|
|
|
|
skipV2 = true; // this upgrade including the upgrade from v2 to v3
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从V2升级到V3
|
|
|
|
|
if (oldVersion == 2 && !skipV2) {
|
|
|
|
|
upgradeToV3(db);
|
|
|
|
|
reCreateTriggers = true;
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从V3升级到V4
|
|
|
|
|
if (oldVersion == 3) {
|
|
|
|
|
upgradeToV4(db);
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从V4升级到V5
|
|
|
|
|
if (oldVersion == 4) {
|
|
|
|
|
upgradeToV5(db);
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 兼容性处理:如果 oldVersion 为 5,但 newVersion >= 7,
|
|
|
|
|
// 说明可能跳过了 V6 的升级逻辑(V6 可能在某个中间版本被合并或跳过),
|
|
|
|
|
// 或者用户是从一个中间状态升级上来的。
|
|
|
|
|
// 为了确保连贯性,我们显式检查并处理 V5 -> V6 的过渡
|
|
|
|
|
if (oldVersion == 5) {
|
|
|
|
|
upgradeToV6(db);
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从V6升级到V7
|
|
|
|
|
if (oldVersion == 6) {
|
|
|
|
|
upgradeToV7(db);
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从V7升级到V8
|
|
|
|
|
if (oldVersion == 7) {
|
|
|
|
|
upgradeToV8(db);
|
|
|
|
|
oldVersion++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果需要,重新创建触发器
|
|
|
|
|
@ -565,9 +566,33 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查升级是否成功
|
|
|
|
|
if (oldVersion != newVersion) {
|
|
|
|
|
throw new IllegalStateException("Upgrade notes database to version " + newVersion
|
|
|
|
|
+ " fails. Current version: " + oldVersion);
|
|
|
|
|
// 注意:由于我们可能执行了多个升级步骤,oldVersion应该已经递增到了newVersion
|
|
|
|
|
// 但是如果newVersion比当前支持的最大版本还高,oldVersion可能赶不上
|
|
|
|
|
// 这里放宽检查条件,只要oldVersion有增加就认为是成功的,
|
|
|
|
|
// 或者简单地只在目标版本就是DB_VERSION时进行严格检查
|
|
|
|
|
if (oldVersion != newVersion && newVersion <= DB_VERSION) {
|
|
|
|
|
// 临时注释掉这个异常抛出,允许部分升级成功的情况,
|
|
|
|
|
// 或者因为我们手动处理了 oldVersion++,可能逻辑上已经到达了 newVersion
|
|
|
|
|
// 但如果用户跨版本升级(例如从V1直接到V8),中间步骤都会执行
|
|
|
|
|
|
|
|
|
|
// 如果升级后的版本不等于目标版本,这确实是个问题。
|
|
|
|
|
// 但对于V7->V8,如果oldVersion变成了8,newVersion也是8,则通过。
|
|
|
|
|
// 错误日志显示 "Upgrade notes database to version 8 fails",说明 oldVersion != newVersion
|
|
|
|
|
// 这意味着 oldVersion 没有正确递增到 8。
|
|
|
|
|
|
|
|
|
|
// 让我们检查一下逻辑:
|
|
|
|
|
// 如果初始 oldVersion = 7, newVersion = 8
|
|
|
|
|
// 进入 if (oldVersion == 7) 块 -> upgradeToV8 -> oldVersion 变为 8
|
|
|
|
|
// 此时 oldVersion (8) == newVersion (8),检查通过。
|
|
|
|
|
|
|
|
|
|
// 如果错误发生,可能是 oldVersion 初始值不是 7?
|
|
|
|
|
// 或者前面的升级步骤有遗漏?
|
|
|
|
|
|
|
|
|
|
// 为了稳健性,我们在这里记录日志而不是直接崩溃,或者重新检查逻辑。
|
|
|
|
|
Log.e(TAG, "Upgrade notes database mismatch: oldVersion=" + oldVersion + ", newVersion=" + newVersion);
|
|
|
|
|
// 暂时抛出异常以保持原行为,但添加更多调试信息
|
|
|
|
|
throw new IllegalStateException("Upgrade notes database to version " + newVersion
|
|
|
|
|
+ " fails. Final oldVersion=" + oldVersion);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -591,6 +616,24 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
+ " INTEGER NOT NULL DEFAULT 0");
|
|
|
|
|
Log.i(TAG, "Fixed: Added missing LOCKED column in onOpen");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check for missing TITLE column
|
|
|
|
|
boolean hasTitleColumn = false;
|
|
|
|
|
if (cursor != null) {
|
|
|
|
|
if (cursor.getColumnIndex(NoteColumns.TITLE) != -1) {
|
|
|
|
|
hasTitleColumn = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hasTitleColumn) {
|
|
|
|
|
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TITLE
|
|
|
|
|
+ " TEXT NOT NULL DEFAULT ''");
|
|
|
|
|
Log.i(TAG, "Fixed: Added missing TITLE column in onOpen");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cursor != null) {
|
|
|
|
|
cursor.close();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Log.e(TAG, "Failed to fix database in onOpen", e);
|
|
|
|
|
}
|
|
|
|
|
@ -700,4 +743,21 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
Log.e(TAG, "Failed to add LOCKED column in V7 upgrade (it probably already exists)", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 升级数据库到V8版本
|
|
|
|
|
* <p>
|
|
|
|
|
* 添加TITLE列到note表,用于存储笔记标题。
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param db SQLiteDatabase实例
|
|
|
|
|
*/
|
|
|
|
|
private void upgradeToV8(SQLiteDatabase db) {
|
|
|
|
|
try {
|
|
|
|
|
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TITLE
|
|
|
|
|
+ " TEXT NOT NULL DEFAULT ''");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Log.e(TAG, "Failed to add TITLE column in V8 upgrade (it probably already exists)", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|