|
|
|
@ -26,7 +26,17 @@ import net.micode.notes.data.Notes.DataColumns;
|
|
|
|
|
import net.micode.notes.data.Notes.DataConstants;
|
|
|
|
|
import net.micode.notes.data.Notes.NoteColumns;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @Package: net.micode.notes.data
|
|
|
|
|
* @ClassName: NotesDatabaseHelper
|
|
|
|
|
* @Description:
|
|
|
|
|
* 这是一个用于管理小米便签的数据库类NotesDatabaseHelper,这个类继承自SQLiteOpenHelper
|
|
|
|
|
* ,用于创建和管理小米便签所需要用到的数据库以及表结构。
|
|
|
|
|
* 类当中包含了5大部分,分别是常量的定义,表结构的创建,触发器的创建,系统文件夹创建以及数据库表的创建
|
|
|
|
|
* 该类是整个小米便签软件中用于数据库管理的核心类。
|
|
|
|
|
* @Author: Dong Jiaqi
|
|
|
|
|
* @CreateDate: 12/23/2023 0:44 AM
|
|
|
|
|
*/
|
|
|
|
|
public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
private static final String DB_NAME = "note.db";
|
|
|
|
|
|
|
|
|
@ -61,7 +71,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
|
|
|
|
|
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
|
|
|
|
|
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
|
|
|
|
|
")";
|
|
|
|
|
")";//这是用于创建便签表的SQL语句,定义了便签表的结构,包含便签各种属性和字段,存储了用户创建的所有便签的信息。
|
|
|
|
|
|
|
|
|
|
private static final String CREATE_DATA_TABLE_SQL =
|
|
|
|
|
"CREATE TABLE " + TABLE.DATA + "(" +
|
|
|
|
@ -76,14 +86,14 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
|
|
|
|
|
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
|
|
|
|
|
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
|
|
|
|
|
")";
|
|
|
|
|
")";//这是用于定义数据表结构的SQL语句,存储了与便签相关的数据信息,包括了各种附加数据,用来扩展便签功能。
|
|
|
|
|
|
|
|
|
|
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
|
|
|
|
|
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
|
|
|
|
|
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Increase folder's note count when move note to the folder
|
|
|
|
|
* 当将便签移动到文件夹时,通过增加文件夹的便签数量来实现
|
|
|
|
|
*/
|
|
|
|
|
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER increase_folder_count_on_update "+
|
|
|
|
@ -95,7 +105,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decrease folder's note count when move note from folder
|
|
|
|
|
* 将便签从文件夹中移出时,通过减少文件夹的便签数量来实现
|
|
|
|
|
*/
|
|
|
|
|
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER decrease_folder_count_on_update " +
|
|
|
|
@ -108,7 +118,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Increase folder's note count when insert new note to the folder
|
|
|
|
|
* 当向文件夹中插入新的便签时,通过增加文件夹的便签数量来实现
|
|
|
|
|
*/
|
|
|
|
|
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER increase_folder_count_on_insert " +
|
|
|
|
@ -120,7 +130,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decrease folder's note count when delete note from the folder
|
|
|
|
|
* 当从文件夹中删除便签时,通过减少文件夹的便签数量来实现
|
|
|
|
|
*/
|
|
|
|
|
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER decrease_folder_count_on_delete " +
|
|
|
|
@ -133,7 +143,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update note's content when insert data with type {@link DataConstants#NOTE}
|
|
|
|
|
* 当插入新的数据类型时,需要更新便签的内容{@link DataConstants#NOTE}
|
|
|
|
|
*/
|
|
|
|
|
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER update_note_content_on_insert " +
|
|
|
|
@ -172,7 +182,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Delete datas belong to note which has been deleted
|
|
|
|
|
* 删除已经被删除的便签所关联的数据
|
|
|
|
|
*/
|
|
|
|
|
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER delete_data_on_delete " +
|
|
|
|
@ -183,7 +193,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Delete notes belong to folder which has been deleted
|
|
|
|
|
* 删除已经被删除的文件夹所包含的便签
|
|
|
|
|
*/
|
|
|
|
|
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER folder_delete_notes_on_delete " +
|
|
|
|
@ -194,7 +204,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
" END";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Move notes belong to folder which has been moved to trash folder
|
|
|
|
|
* 将已经被移动到回收站文件夹的文件夹中的便签也一并移动到回收站文件夹
|
|
|
|
|
*/
|
|
|
|
|
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
|
|
|
|
|
"CREATE TRIGGER folder_move_notes_on_trash " +
|
|
|
|
@ -210,6 +220,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
super(context, DB_NAME, null, DB_VERSION);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建便签表、重新创建触发器并创建系统文件夹
|
|
|
|
|
* @param: 一个SQLiteDatabase对象db,表示要创建便签的数据库
|
|
|
|
|
*/
|
|
|
|
|
public void createNoteTable(SQLiteDatabase db) {
|
|
|
|
|
db.execSQL(CREATE_NOTE_TABLE_SQL);
|
|
|
|
|
reCreateNoteTableTriggers(db);
|
|
|
|
@ -217,6 +231,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
Log.d(TAG, "note table has been created");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新创建和便签表相关的触发器,会在数据库中对触发器进行设置,以便在特定操作时自动执行相应的处理过程。
|
|
|
|
|
* @param: db
|
|
|
|
|
*/
|
|
|
|
|
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");
|
|
|
|
@ -235,6 +253,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初始化数据库中的系统文件夹,确保在数据库中存在且具有特定的属性和类型标识。
|
|
|
|
|
* @param: db
|
|
|
|
|
*/
|
|
|
|
|
private void createSystemFolder(SQLiteDatabase db) {
|
|
|
|
|
ContentValues values = new ContentValues();
|
|
|
|
|
|
|
|
|
@ -277,6 +299,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
Log.d(TAG, "data table has been created");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新创建一个和数据表相关的触发器,先删除3个已经存在的触发器,再一次创建3个新的触发器
|
|
|
|
|
* @param db
|
|
|
|
|
*/
|
|
|
|
|
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");
|
|
|
|
@ -287,6 +313,15 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 这个方法确保了在整个应用程序当中只创建了一个NotesDatabaseHelper实例
|
|
|
|
|
* 并且提供了一个全局访问点,让其他部分可以方便地获取该实例并且使用数据库功能,提供了对数据库的统一管理和访问
|
|
|
|
|
* @param context Context是一个表示当前应用程序的环境的类,包含了应用程序全局信息。
|
|
|
|
|
* 在这个方法中,Context context参数用于创建NoteDatabaseHelper实例时所需的环境信息,
|
|
|
|
|
* 传入参数确保正确地获取了应用程序的环境信息。
|
|
|
|
|
* @return mInstance是一个实例,如果为null表示还没有创建这个类的实例,会创建一个新的实例并且赋值给它。
|
|
|
|
|
* 无论是新建的实例或者是已经存在的实例按照mInstance返回。避免了多个实例的创建和内存的浪费。
|
|
|
|
|
*/
|
|
|
|
|
static synchronized NotesDatabaseHelper getInstance(Context context) {
|
|
|
|
|
if (mInstance == null) {
|
|
|
|
|
mInstance = new NotesDatabaseHelper(context);
|
|
|
|
@ -300,11 +335,21 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
|
|
|
|
createDataTable(db);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 这个方法的功能是根据新旧版本号,依次来执行相应的数据库升级操作,从而确保数据库的结构和内容能够与新版本要求相匹配。
|
|
|
|
|
* @param db 表示要升级的数据库对象
|
|
|
|
|
* @param oldVersion 表示当前数据库的旧版本号
|
|
|
|
|
* @param newVersion 表示需要升级到的新版本号
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
|
|
|
|
boolean reCreateTriggers = false;
|
|
|
|
|
boolean skipV2 = false;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 该语句块是一个数据库升级的逻辑处理,它的功能是按照旧版本号和新版本号的要求执行相应的数据库升级操作,并进行相关的标记和检查。
|
|
|
|
|
* 这个语句块的目的是实现数据库版本升级,通过这样的逻辑判断,可以保证数据库的顺序升级,并在每个升级阶段进行必要的操作和标记,以确保升级的正确性和完整性。
|
|
|
|
|
*/
|
|
|
|
|
if (oldVersion == 1) {
|
|
|
|
|
upgradeToV2(db);
|
|
|
|
|
skipV2 = true; // this upgrade including the upgrade from v2 to v3
|
|
|
|
|