/* * 该类为Notes数据库的辅助类,负责管理数据库的创建和版本管理。 */ package net.micode.notes.data; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * NotesDatabaseHelper 类是一个SQLiteOpenHelper子类,它扩展了Android提供的SQLiteOpenHelper以实现自定义的数据库操作。 */ public class NotesDatabaseHelper extends SQLiteOpenHelper { // 数据库名称 private static final String DB_NAME = "note.db"; // 数据库版本号,当数据库模式改变时需要更新此值。 private static final int DB_VERSION = 4; /** * 表接口,定义了数据库中的两个表名。 */ public interface TABLE { public static final String NOTE = "note"; // 笔记表名 public static final String DATA = "data"; // 数据表名 } // 日志标签,用于输出日志信息。 private static final String TAG = "NotesDatabaseHelper"; // 单例模式,确保数据库辅助类的唯一实例。 private static NotesDatabaseHelper mInstance; // 创建NOTE表的SQL语句,定义了笔记表的结构。 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + ")"; // 创建DATA表的SQL语句,定义了数据表的结构。 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + DataColumns.MIME_TYPE + " TEXT NOT NULL," + DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA1 + " INTEGER," + DataColumns.DATA2 + " INTEGER," + DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + ")"; // 创建DATA表的NOTE_ID索引的SQL语句,加速基于NOTE_ID的查询。 private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; // ... 省略其他触发器定义 /** * 构造函数,私有化以防止外部实例化。 * * @param context 上下文对象,用于访问应用的资源和其他组件。 */ public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } /** * 创建NOTE表,并重新创建NOTE表的触发器,然后创建系统文件夹。 * * @param db SQLiteDatabase对象,用于执行SQL创建语句。 */ public void createNoteTable(SQLiteDatabase db) { db.execSQL(CREATE_NOTE_TABLE_SQL); reCreateNoteTableTriggers(db); createSystemFolder(db); Log.d(TAG, "note table has been created"); } // ... 省略其他创建和触发器相关的方法 /** * 获取 NotesDatabaseHelper 的单例对象。 * * @param context Context类型,应用上下文。 * @return NotesDatabaseHelper类型的单例对象。 */ static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } return mInstance; } /** * 创建数据库表,在数据库首次创建时调用。 * * @param db SQLiteDatabase类型,数据库对象。 */ @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } /** * 升级数据库,当数据库版本号增加时调用。 * * @param db SQLiteDatabase类型,数据库对象。 * @param oldVersion int类型,旧版本号。 * @param newVersion int类型,新版本号。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; boolean skipV2 = false; // 根据旧版本号逐步升级到新版本。 if (oldVersion <= 1) { upgradeToV2(db); skipV2 = true; // 包含从 v2 到 v3 的升级 oldVersion++; } if (oldVersion == 2 && !skipV2) { upgradeToV3(db); reCreateTriggers = true; oldVersion++; } if (oldVersion == 3) { upgradeToV4(db); oldVersion++; } // 如果触发器被标记为需要重新创建,则进行重新创建。 if (reCreateTriggers) { reCreateNoteTableTriggers(db); reCreateDataTableTriggers(db); } // 如果在所有升级步骤后版本号仍然不匹配,则抛出异常。 if (oldVersion != newVersion) { throw new IllegalStateException("Upgrade notes database to version " + newVersion + " failed."); } } // ... 省略各个版本的升级方法(upgradeToV2, upgradeToV3, upgradeToV4) }