|
|
|
|
@ -27,8 +27,9 @@ import net.micode.notes.data.Notes.DataConstants;
|
|
|
|
|
import net.micode.notes.data.Notes.NoteColumns;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 笔记数据库帮助类
|
|
|
|
|
* 负责创建和管理SQLite数据库,包括笔记表和数据表
|
|
|
|
|
* 笔记数据库帮助类。
|
|
|
|
|
* <p>职责:负责 SQLite 数据库的创建、升级以及触发器维护;提供 note/data 两张表及其索引、系统文件夹初始化。</p>
|
|
|
|
|
* <p>使用方式:通过 {@link #getInstance(Context)} 获取单例,供 ContentProvider 等数据层组件使用。</p>
|
|
|
|
|
*/
|
|
|
|
|
public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
/** 数据库名称 */
|
|
|
|
|
@ -93,9 +94,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
"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 "+
|
|
|
|
|
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
|
|
|
|
|
@ -105,9 +104,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当笔记从文件夹移出时,减少文件夹的笔记计数
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:当笔记从文件夹移出时,减少原文件夹的笔记计数 */
|
|
|
|
|
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER decrease_folder_count_on_update " +
|
|
|
|
|
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
|
|
|
|
|
@ -118,9 +115,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当向文件夹插入新笔记时,增加文件夹的笔记计数
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:向某文件夹插入新笔记时,增加该文件夹的计数 */
|
|
|
|
|
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER increase_folder_count_on_insert " +
|
|
|
|
|
" AFTER INSERT ON " + TABLE.NOTE +
|
|
|
|
|
@ -130,9 +125,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当从文件夹删除笔记时,减少文件夹的笔记计数
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:删除笔记时,减少其父文件夹的计数 */
|
|
|
|
|
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER decrease_folder_count_on_delete " +
|
|
|
|
|
" AFTER DELETE ON " + TABLE.NOTE +
|
|
|
|
|
@ -143,9 +136,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" AND " + NoteColumns.NOTES_COUNT + ">0;" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当插入类型为{@link DataConstants#NOTE}的数据时,更新笔记内容
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:插入 TEXT_NOTE 类型的数据行时,用数据内容刷新 note.snippet */
|
|
|
|
|
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER update_note_content_on_insert " +
|
|
|
|
|
" AFTER INSERT ON " + TABLE.DATA +
|
|
|
|
|
@ -156,9 +147,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当类型为{@link DataConstants#NOTE}的数据更新时,更新笔记内容
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:更新 TEXT_NOTE 数据行时,同步更新 note.snippet */
|
|
|
|
|
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER update_note_content_on_update " +
|
|
|
|
|
" AFTER UPDATE ON " + TABLE.DATA +
|
|
|
|
|
@ -169,9 +158,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当类型为{@link DataConstants#NOTE}的数据删除时,更新笔记内容
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:删除 TEXT_NOTE 数据行时,清空 note.snippet */
|
|
|
|
|
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER update_note_content_on_delete " +
|
|
|
|
|
" AFTER delete ON " + TABLE.DATA +
|
|
|
|
|
@ -182,9 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当笔记被删除时,删除属于该笔记的所有数据
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:删除笔记时,级联删除 data 表中对应数据 */
|
|
|
|
|
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER delete_data_on_delete " +
|
|
|
|
|
" AFTER DELETE ON " + TABLE.NOTE +
|
|
|
|
|
@ -193,9 +178,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当文件夹被删除时,删除属于该文件夹的所有笔记
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:删除文件夹时,级联删除该文件夹下的笔记 */
|
|
|
|
|
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER folder_delete_notes_on_delete " +
|
|
|
|
|
" AFTER DELETE ON " + TABLE.NOTE +
|
|
|
|
|
@ -204,9 +187,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发器:当文件夹被移动到回收站时,将其中的笔记也移动到回收站
|
|
|
|
|
*/
|
|
|
|
|
/** 触发器:移动文件夹到回收站时,其子笔记也同步移动到回收站 */
|
|
|
|
|
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER folder_move_notes_on_trash " +
|
|
|
|
|
" AFTER UPDATE ON " + TABLE.NOTE +
|
|
|
|
|
@ -218,7 +199,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构造函数
|
|
|
|
|
* 构造函数。
|
|
|
|
|
*
|
|
|
|
|
* @param context 上下文对象
|
|
|
|
|
*/
|
|
|
|
|
public NotesDatabaseHelper(Context context) {
|
|
|
|
|
@ -226,7 +208,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建笔记表
|
|
|
|
|
* 创建笔记表并初始化触发器、系统文件夹。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
public void createNoteTable(SQLiteDatabase db) {
|
|
|
|
|
@ -237,7 +220,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新创建笔记表的触发器
|
|
|
|
|
* 重新创建笔记表的触发器。
|
|
|
|
|
* <p>升级或重建表后调用,确保触发器定义与最新结构一致。</p>
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
private void reCreateNoteTableTriggers(SQLiteDatabase db) {
|
|
|
|
|
@ -259,38 +244,32 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建系统文件夹
|
|
|
|
|
* 创建系统文件夹。
|
|
|
|
|
* <p>依次插入通话记录、根、临时、回收站四个系统文件夹。</p>
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建根文件夹(默认文件夹)
|
|
|
|
|
*/
|
|
|
|
|
// 创建根文件夹(默认文件夹)
|
|
|
|
|
values.clear();
|
|
|
|
|
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
|
|
|
|
|
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
|
|
|
|
db.insert(TABLE.NOTE, null, values);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建临时文件夹(用于移动笔记)
|
|
|
|
|
*/
|
|
|
|
|
// 创建临时文件夹(用于移动笔记)
|
|
|
|
|
values.clear();
|
|
|
|
|
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
|
|
|
|
|
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
|
|
|
|
db.insert(TABLE.NOTE, null, values);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建回收站文件夹
|
|
|
|
|
*/
|
|
|
|
|
// 创建回收站文件夹
|
|
|
|
|
values.clear();
|
|
|
|
|
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
|
|
|
|
|
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
|
|
|
|
@ -298,7 +277,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建数据表
|
|
|
|
|
* 创建数据表并初始化触发器、索引。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
public void createDataTable(SQLiteDatabase db) {
|
|
|
|
|
@ -309,7 +289,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新创建数据表的触发器
|
|
|
|
|
* 重新创建数据表的触发器。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
private void reCreateDataTableTriggers(SQLiteDatabase db) {
|
|
|
|
|
@ -323,7 +304,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取数据库帮助类的单例实例
|
|
|
|
|
* 获取数据库帮助类的单例实例。
|
|
|
|
|
*
|
|
|
|
|
* @param context 上下文对象
|
|
|
|
|
* @return 数据库帮助类实例
|
|
|
|
|
*/
|
|
|
|
|
@ -334,9 +316,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
return mInstance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建数据库
|
|
|
|
|
*/
|
|
|
|
|
/** 创建数据库:依次创建 note 表与 data 表 */
|
|
|
|
|
@Override
|
|
|
|
|
public void onCreate(SQLiteDatabase db) {
|
|
|
|
|
createNoteTable(db);
|
|
|
|
|
@ -344,7 +324,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 升级数据库
|
|
|
|
|
* 升级数据库。
|
|
|
|
|
* <p>根据旧版本依次执行升级步骤,并在必要时重建触发器。</p>
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
|
|
|
|
@ -380,7 +361,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 升级数据库到版本2
|
|
|
|
|
* 升级数据库到版本2:重建所有表。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
private void upgradeToV2(SQLiteDatabase db) {
|
|
|
|
|
@ -391,7 +373,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 升级数据库到版本3
|
|
|
|
|
* 升级数据库到版本3:移除旧触发器,增加 gtask_id 列,并插入回收站系统文件夹。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
private void upgradeToV3(SQLiteDatabase db) {
|
|
|
|
|
@ -410,7 +393,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 升级数据库到版本4
|
|
|
|
|
* 升级数据库到版本4:为 note 表新增 version 字段,用于同步冲突控制。
|
|
|
|
|
*
|
|
|
|
|
* @param db 数据库对象
|
|
|
|
|
*/
|
|
|
|
|
private void upgradeToV4(SQLiteDatabase db) {
|
|
|
|
|
|