package net.micode.notes.data; // 定义包名 import android.content.ContentValues; // 用于存储数据的键值对,便于数据库操作 import android.content.Context; // 用于访问应用环境和资源 import android.database.sqlite.SQLiteDatabase; // 用于执行SQL语句和进行数据库操作 import android.database.sqlite.SQLiteOpenHelper; // 管理数据库创建和版本控制的帮助类 import android.util.Log; // 用于日志输出 import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; // 导入相关类,用于定义数据库表格的列名和常量 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; // 单例模式中的实例 // 创建笔记表的SQL语句 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + // 定义各列及其数据类型和约束条件 ")"; // 创建数据表的SQL语句 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + // 定义各列及其数据类型和约束条件 ")"; // 创建索引以加快根据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 + ");"; // 定义触发器,当笔记移动到文件夹时增加文件夹中的笔记计数 private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update " + // 触发器定义及逻辑 " END"; // 定义触发器,当笔记从文件夹中移出时减少文件夹中的笔记计数 private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update " + // 触发器定义及逻辑 " END"; // 定义触发器,当向文件夹中插入新笔记时增加文件夹中的笔记计数 private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert " + // 触发器定义及逻辑 " END"; // 定义触发器,当从文件夹中删除笔记时减少文件夹中的笔记计数 private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete " + // 触发器定义及逻辑 " END"; // 定义触发器,当插入新数据时更新笔记的内容摘要 private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert " + // 触发器定义及逻辑 " END"; // 定义触发器,当数据更新时更新笔记的内容摘要 private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + // 触发器定义及逻辑 " END"; // 定义触发器,当数据删除时清除笔记的内容摘要 private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete " + // 触发器定义及逻辑 " END"; // 定义触发器,当删除笔记时同时删除相关的数据 private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete " + // 触发器定义及逻辑 " END"; // 定义触发器,当删除文件夹时同时删除文件夹中的所有笔记 private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete " + // 触发器定义及逻辑 " END"; // 定义触发器,当文件夹移动到垃圾桶时将文件夹中的所有笔记也移动到垃圾桶 private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash " + // 触发器定义及逻辑 " END"; public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); // 调用父类构造函数 } public void createNoteTable(SQLiteDatabase db) { db.execSQL(CREATE_NOTE_TABLE_SQL); // 执行创建笔记表的SQL语句 reCreateNoteTableTriggers(db); // 重新创建笔记表的触发器 createSystemFolder(db); // 创建系统文件夹 Log.d(TAG, "note table has been created"); // 输出日志 } private void reCreateNoteTableTriggers(SQLiteDatabase db) { // 删除旧的触发器 db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); // 创建新的触发器 db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); // 创建系统文件夹 values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); // 创建其他系统文件夹 // ... } public void createDataTable(SQLiteDatabase db) { db.execSQL(CREATE_DATA_TABLE_SQL); // 执行创建数据表的SQL语句 reCreateDataTableTriggers(db); // 重新创建数据表的触发器 db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); // 创建索引 Log.d(TAG, "data table has been created"); // 输出日志 } private void reCreateDataTableTriggers(SQLiteDatabase db) { // 删除旧的数据表触发器 db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); // 创建新的数据表触发器 db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); } static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } return mInstance; } @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); // 创建笔记表 createDataTable(db); // 创建数据表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库版本升级逻辑 } private void upgradeToV2(SQLiteDatabase db) { // 升级到版本2的逻辑 } private void upgradeToV3(SQLiteDatabase db) { // 升级到版本3的逻辑 } private void upgradeToV4(SQLiteDatabase db) { // 升级到版本4的逻辑 } }