From 22978f08aaf9730d3464be64526c6339dc1e033a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E8=89=B3?= <1120151662@qq.com> Date: Fri, 12 May 2023 00:16:33 +0800 Subject: [PATCH] =?UTF-8?q?data=E5=8C=85=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notes/data/NotesDatabaseHelper.java | 674 +++++++++--------- .../net/micode/notes/data/NotesProvider.java | 483 +++++++------ 2 files changed, 581 insertions(+), 576 deletions(-) diff --git a/Notes-master2/src/net/micode/notes/data/NotesDatabaseHelper.java b/Notes-master2/src/net/micode/notes/data/NotesDatabaseHelper.java index ffe5d57..89ac336 100644 --- a/Notes-master2/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/Notes-master2/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -27,336 +27,348 @@ import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; +/** + +该类是Notes应用程序的数据库帮助器类,用于创建和升级应用程序的数据库。 +*/ 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; - - 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" + - ")"; - - 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 ''" + - ")"; - - 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 "+ - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " 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 " + - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + - " 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 " + - " AFTER INSERT ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END"; - - /** - * Update note's content when insert data with type {@link DataConstants#NOTE} - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = - "CREATE TRIGGER update_note_content_on_insert " + - " AFTER INSERT ON " + TABLE.DATA + - " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has changed - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER update_note_content_on_update " + - " AFTER UPDATE ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has deleted - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = - "CREATE TRIGGER update_note_content_on_delete " + - " AFTER delete ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=''" + - " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.DATA + - " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " 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 " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.NOTE + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " 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 " + - " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - public NotesDatabaseHelper(Context context) { - super(context, DB_NAME, null, DB_VERSION); - } - - public void createNoteTable(SQLiteDatabase db) { - db.execSQL(CREATE_NOTE_TABLE_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(); - - /** - * call record foler for call notes - */ - values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * root folder which is default folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * temporary folder which is used for moving note - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * create trash folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - public void createDataTable(SQLiteDatabase db) { - db.execSQL(CREATE_DATA_TABLE_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) { - boolean reCreateTriggers = false; - boolean skipV2 = false; - - if (oldVersion == 1) { - upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to 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 - + "fails"); - } - } - - private void upgradeToV2(SQLiteDatabase db) { - db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); - createNoteTable(db); - createDataTable(db); - } - - private void upgradeToV3(SQLiteDatabase db) { - // drop unused triggers - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // add a column for gtask id - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID - + " TEXT NOT NULL DEFAULT ''"); - // add a trash system folder - ContentValues values = new ContentValues(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - private void upgradeToV4(SQLiteDatabase db) { - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION - + " INTEGER NOT NULL DEFAULT 0"); - } + +/** + +数据库名称 +*/ +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语句 +*/ +private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + +TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; +/** + +更新NOTE表中PARENT_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 + +" BEGIN " + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + +" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + +" END"; +/** + +更新NOTE表中PARENT_ID字段时,减少该文件夹的笔记计数器的触发器 +*/ +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 + +" BEGIN " + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + +" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + +" 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 + +" BEGIN " + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + +" 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 + +" BEGIN " + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + +" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + +" AND " + NoteColumns.NOTES_COUNT + ">0;" + +" END"; + +// 在插入类型为 "note" 的数据时更新笔记内容的触发器 +private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = +"CREATE TRIGGER update_note_content_on_insert " + +" AFTER INSERT ON " + TABLE.DATA + +" WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + +" BEGIN" + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + +" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + +" END"; + +// 在更新类型为 "note" 的数据时更新笔记内容的触发器 +private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = +"CREATE TRIGGER update_note_content_on_update " + +" AFTER UPDATE ON " + TABLE.DATA + +" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + +" BEGIN" + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + +" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + +" END"; + +// 在删除类型为 "note" 的数据时更新笔记内容的触发器 +private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = +"CREATE TRIGGER update_note_content_on_delete " + +" AFTER delete ON " + TABLE.DATA + +" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + +" BEGIN" + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.SNIPPET + "=''" + +" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + +" END"; + +// 在删除笔记时删除属于该笔记的数据的触发器 +private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = +"CREATE TRIGGER delete_data_on_delete " + +" AFTER DELETE ON " + TABLE.NOTE + +" BEGIN" + +" DELETE FROM " + TABLE.DATA + +" 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 + +" BEGIN" + +" DELETE FROM " + TABLE.NOTE + +" 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 + +" WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + +" BEGIN" + +" UPDATE " + TABLE.NOTE + +" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + +" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + +" END"; + +public NotesDatabaseHelper(Context context) { +super(context, DB_NAME, null, DB_VERSION); +} + +// 创建笔记表 +public void createNoteTable(SQLiteDatabase db) { +db.execSQL(CREATE_NOTE_TABLE_SQL); // 创建note表 +reCreateNoteTableTriggers(db); // 重新创建note表的触发器 +createSystemFolder(db); // 创建系统文件夹 +Log.d(TAG, "note table has been created"); // 记录日志,提示note表已被创建 +} + +// 重新创建笔记表的触发器 +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(); + +/** + * call record foler for call notes + * 通话记录文件夹 + */ +values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); +values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +db.insert(TABLE.NOTE, null, values); + +/** + * root folder which is default folder + * 默认文件夹 + */ +values.clear(); +values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); +values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +db.insert(TABLE.NOTE, null, values); + +/** + * temporary folder which is used for moving note + * 用于移动笔记的临时文件夹 + */ +values.clear(); +values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); +values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +db.insert(TABLE.NOTE, null, values); + +/** + * create trash folder + * 回收站文件夹 + */ +values.clear(); +values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); +values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +db.insert(TABLE.NOTE, null, values); +} + +public void createDataTable(SQLiteDatabase db) { +db.execSQL(CREATE_DATA_TABLE_SQL); // 创建data表 +reCreateDataTableTriggers(db); // 重新创建data表的触发器 +db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); // 创建data表的note_id索引 +Log.d(TAG, "data table has been created"); // 记录日志,提示data表已被创建 +} + +private void reCreateDataTableTriggers(SQLiteDatabase db) { +db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); // 删除插入note时更新数据触发器 +db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); // 删除更新note时更新数据触发器 +db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); // 删除删除note时更新数据触发器 + +db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); // 创建插入note时更新数据触发器 +db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); // 创建更新note时更新数据触发器 +db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); // 创建删除note时更新数据触发器 +} + +static synchronized NotesDatabaseHelper getInstance(Context context) { +if (mInstance == null) { +mInstance = new NotesDatabaseHelper(context); // 单例模式,获取NotesDatabaseHelper实例 +} +return mInstance; +} + +@Override +public void onCreate(SQLiteDatabase db) { +createNoteTable(db); // 创建note表 +createDataTable(db); // 创建data表 +} + +@Override +public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { +boolean reCreateTriggers = false; +boolean skipV2 = false; + +if (oldVersion == 1) { + upgradeToV2(db); // 更新到版本2 + skipV2 = true; // 这次更新同时包含版本2到版本3的更新 + oldVersion++; +} + +if (oldVersion == 2 && !skipV2) { + upgradeToV3(db); // 更新到版本3 + reCreateTriggers = true; + oldVersion++; +} + +if (oldVersion == 3) { + upgradeToV4(db); // 更新到版本4 + oldVersion++; +} + +if (reCreateTriggers) { + reCreateNoteTableTriggers(db); // 重新创建note表触发器 + reCreateDataTableTriggers(db); // 重新创建data表触发器 +} + +if (oldVersion != newVersion) { + throw new IllegalStateException("Upgrade notes database to version " + newVersion + + "fails"); // 如果更新版本不是最新版本,则输出错误信息 +} +} + +private void upgradeToV2(SQLiteDatabase db) { +db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); // 删除note表 +db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); // 删除data表 +createNoteTable(db); // 创建note表 +createDataTable(db); // 创建data表 +} + +private void upgradeToV3(SQLiteDatabase db) { +// drop unused triggers +db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); // 删除插入note时更新修改日期触发器 +db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); // 删除删除note时更新修改日期触发器 +db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); // 删除更新note时更新修改日期触发器 + +// add a column for gtask id +db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + + " TEXT NOT NULL DEFAULT ''"); // 在note表中添加gtask列 + +// add a trash system folder +ContentValues values = new ContentValues(); +values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); // 添加回收站文件夹 +values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +db.insert(TABLE.NOTE, null, values); +} + +private void upgradeToV4(SQLiteDatabase db) { +db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION ++ " INTEGER NOT NULL DEFAULT 0"); // 在note表中添加版本列 } diff --git a/Notes-master2/src/net/micode/notes/data/NotesProvider.java b/Notes-master2/src/net/micode/notes/data/NotesProvider.java index edb0a60..86743f9 100644 --- a/Notes-master2/src/net/micode/notes/data/NotesProvider.java +++ b/Notes-master2/src/net/micode/notes/data/NotesProvider.java @@ -36,36 +36,36 @@ import net.micode.notes.data.NotesDatabaseHelper.TABLE; public class NotesProvider extends ContentProvider { - private static final UriMatcher mMatcher; +// 定义UriMatcher,用于匹配Uri +private static final UriMatcher mMatcher; +// 数据库帮助类 +private NotesDatabaseHelper mHelper; +// 日志标识 +private static final String TAG = "NotesProvider"; +// Uri匹配的常量值 +private static final int URI_NOTE = 1; +private static final int URI_NOTE_ITEM = 2; +private static final int URI_DATA = 3; +private static final int URI_DATA_ITEM = 4; +private static final int URI_SEARCH = 5; +private static final int URI_SEARCH_SUGGEST = 6; - private NotesDatabaseHelper mHelper; - - private static final String TAG = "NotesProvider"; - - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; - - private static final int URI_SEARCH = 5; - private static final int URI_SEARCH_SUGGEST = 6; - - static { - mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); - } +static { + mMatcher = new UriMatcher(UriMatcher.NO_MATCH); + // 添加Uri匹配规则 + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); +} - /** - * x'0A' represents the '\n' character in sqlite. For title and content in the search result, - * we will trim '\n' and white space in order to show more information. - */ - private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," +/** + * 将'\n'字符替换成空格,用于搜索结果标题和内容的显示 + */ +private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," @@ -73,233 +73,226 @@ public class NotesProvider extends ContentProvider { + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; - private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION - + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" - + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER - + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - - @Override - public boolean onCreate() { - mHelper = NotesDatabaseHelper.getInstance(getContext()); - return true; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - Cursor c = null; - SQLiteDatabase db = mHelper.getReadableDatabase(); - String id = null; - switch (mMatcher.match(uri)) { - case URI_NOTE: - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_DATA: - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_SEARCH: - case URI_SEARCH_SUGGEST: - if (sortOrder != null || projection != null) { - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); - } - - String searchString = null; - if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { - if (uri.getPathSegments().size() > 1) { - searchString = uri.getPathSegments().get(1); - } - } else { - searchString = uri.getQueryParameter("pattern"); - } - - if (TextUtils.isEmpty(searchString)) { - return null; - } - - try { - searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); - } catch (IllegalStateException ex) { - Log.e(TAG, "got exception: " + ex.toString()); - } - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - if (c != null) { - c.setNotificationUri(getContext().getContentResolver(), uri); - } - return c; - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - SQLiteDatabase db = mHelper.getWritableDatabase(); - long dataId = 0, noteId = 0, insertedId = 0; - switch (mMatcher.match(uri)) { - case URI_NOTE: - insertedId = noteId = db.insert(TABLE.NOTE, null, values); - break; - case URI_DATA: - if (values.containsKey(DataColumns.NOTE_ID)) { - noteId = values.getAsLong(DataColumns.NOTE_ID); - } else { - Log.d(TAG, "Wrong data format without note id:" + values.toString()); - } - insertedId = dataId = db.insert(TABLE.DATA, null, values); - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - // Notify the note uri - if (noteId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); - } - - // Notify the data uri - if (dataId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); - } +// 搜索语句 +private static String NOTES_SNIPPET_SEARCH_QUERY = + "SELECT " + NOTES_SEARCH_PROJECTION + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - return ContentUris.withAppendedId(uri, insertedId); - } +@Override +public boolean onCreate() { + // 获取数据库帮助类实例 + mHelper = NotesDatabaseHelper.getInstance(getContext()); + return true; +} - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean deleteData = false; - switch (mMatcher.match(uri)) { - case URI_NOTE: - selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; - count = db.delete(TABLE.NOTE, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ - long noteId = Long.valueOf(id); - if (noteId <= 0) { - break; +@Override +public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + Cursor c = null; + SQLiteDatabase db = mHelper.getReadableDatabase(); + String id = null; + switch (mMatcher.match(uri)) { + case URI_NOTE: + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, + sortOrder); + break; + case URI_NOTE_ITEM: + id = uri.getPathSegments().get(1); + c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_DATA: + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, + sortOrder); + break; + case URI_DATA_ITEM: + id = uri.getPathSegments().get(1); + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_SEARCH: + case URI_SEARCH_SUGGEST: + if (sortOrder != null || projection != null) { + throw new IllegalArgumentException( + "do not specify sortOrder, selection, selectionArgs, or projection" + + "with this query"); + } + String searchString = null; + if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { + if (uri.getPathSegments().size() > 1) { + searchString = uri.getPathSegments().get(1); } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.delete(TABLE.DATA, selection, selectionArgs); - deleteData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - deleteData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - if (count > 0) { - if (deleteData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } else { + searchString = uri.getQueryParameter("pattern"); } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean updateData = false; - switch (mMatcher.match(uri)) { - case URI_NOTE: - increaseNoteVersion(-1, selection, selectionArgs); - count = db.update(TABLE.NOTE, values, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.update(TABLE.DATA, values, selection, selectionArgs); - updateData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - updateData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - - if (count > 0) { - if (updateData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + if (TextUtils.isEmpty(searchString)) { + return null; + } + try { + searchString = String.format("%%%s%%", searchString); + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, + new String[] { searchString }); + } catch (IllegalStateException ex) { + Log.e(TAG, "got exception: " + ex.toString()); } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); } - - private String parseSelection(String selection) { - return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); + if (c != null) { + // 设置查询结果发生改变时更新的Uri + c.setNotificationUri(getContext().getContentResolver(), uri); } + return c; +} +} + @Override +public Uri insert(Uri uri, ContentValues values) { +SQLiteDatabase db = mHelper.getWritableDatabase();//获取写入模式的数据库 +long dataId = 0, noteId = 0, insertedId = 0;//初始化三个变量 +switch (mMatcher.match(uri)) {//根据Uri匹配相应的操作 +case URI_NOTE://如果是Note表 +insertedId = noteId = db.insert(TABLE.NOTE, null, values);//插入数据并获取行号 +break; +case URI_DATA://如果是Data表 +if (values.containsKey(DataColumns.NOTE_ID)) {//判断是否包含note id +noteId = values.getAsLong(DataColumns.NOTE_ID);//获取note id +} else { +Log.d(TAG, "Wrong data format without note id:" + values.toString());//打印错误日志 +} +insertedId = dataId = db.insert(TABLE.DATA, null, values);//插入数据并获取行号 +break; +default: +throw new IllegalArgumentException("Unknown URI " + uri);//如果Uri不匹配则抛异常 +} +// Notify the note uri +if (noteId > 0) {//如果note id不为空 +getContext().getContentResolver().notifyChange(//调用notifyChange方法,通知Uri已经被更改 +ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);//ContentUris.withAppendedId方法是在后面添加一个id,用来获取Uri +} +// Notify the data uri +if (dataId > 0) {//如果data id不为空 +getContext().getContentResolver().notifyChange(//调用notifyChange方法,通知Uri已经被更改 +ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);//ContentUris.withAppendedId方法是在后面添加一个id,用来获取Uri +} +return ContentUris.withAppendedId(uri, insertedId);//最终返回更新后的Uri +} - private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { - StringBuilder sql = new StringBuilder(120); - sql.append("UPDATE "); - sql.append(TABLE.NOTE); - sql.append(" SET "); - sql.append(NoteColumns.VERSION); - sql.append("=" + NoteColumns.VERSION + "+1 "); +@Override +public int delete(Uri uri, String selection, String[] selectionArgs) { +int count = 0; +String id = null; +SQLiteDatabase db = mHelper.getWritableDatabase();//获取写入模式的数据库 +boolean deleteData = false;//初始化deleteData变量 +switch (mMatcher.match(uri)) {//根据Uri匹配相应的操作 +case URI_NOTE://如果是Note表 +selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 ";//删除条件 +count = db.delete(TABLE.NOTE, selection, selectionArgs);//删除数据,并获取删除行数 +break; +case URI_NOTE_ITEM: +id = uri.getPathSegments().get(1);//获取Uri中的id +/*ID that smaller than 0 is system folder which is not allowed to trash*/ +long noteId = Long.valueOf(id);//将id转化为long类型 +if (noteId <= 0) { +break; +} +count = db.delete(TABLE.NOTE, +NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs);//删除数据,并获取删除行数 +break; +case URI_DATA://如果是Data表 +count = db.delete(TABLE.DATA, selection, selectionArgs);//删除数据,并获取删除行数 +deleteData = true;//deleteData为true +break; +case URI_DATA_ITEM: +id = uri.getPathSegments().get(1);//获取Uri中的id +count = db.delete(TABLE.DATA, +DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs);//删除数据,并获取删除行数 +deleteData = true;//deleteData为true +break; +default: +throw new IllegalArgumentException("Unknown URI " + uri);//如果Uri不匹配则抛异常 +} +if (count > 0) {//如果删除行数大于0 +if (deleteData) {//如果是Data表 +getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);//调用notifyChange方法,通知Uri已经被更改 +} +getContext().getContentResolver().notifyChange(uri, null);//调用notifyChange方法,通知Uri已经被更改 +} +return count;//返回删除行数 +} - if (id > 0 || !TextUtils.isEmpty(selection)) { - sql.append(" WHERE "); - } - if (id > 0) { - sql.append(NoteColumns.ID + "=" + String.valueOf(id)); - } - if (!TextUtils.isEmpty(selection)) { - String selectString = id > 0 ? parseSelection(selection) : selection; - for (String args : selectionArgs) { - selectString = selectString.replaceFirst("\\?", args); - } - sql.append(selectString); - } +@Override +public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { +int count = 0; +String id = null; +SQLiteDatabase db = mHelper.getWritableDatabase();//获取写入模式的数据库 +boolean updateData = false;//初始化updateData变量 +switch (mMatcher.match(uri)) {//根据Uri匹配相应的操作 +case URI_NOTE://如果是Note表 +increaseNoteVersion(-1, selection, selectionArgs);//更新版本号 +count = db.update(TABLE.NOTE, values, selection, selectionArgs);//更新数据,并获取更新行数 +break; +case URI_NOTE_ITEM: +id = uri.getPathSegments().get(1);//获取Uri中的id +increaseNoteVersion(Long.valueOf(id), selection, selectionArgs);//更新版本号 +count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id ++ parseSelection(selection), selectionArgs);//更新数据,并获取更新行数 +break; +case URI_DATA://如果是Data表 +count = db.update(TABLE.DATA, values, selection, selectionArgs);//更新数据,并获取更新行数 +updateData = true;//updateData为true +break; +case URI_DATA_ITEM: +id = uri.getPathSegments().get(1);//获取Uri中的id +count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id ++ parseSelection(selection), selectionArgs);//更新数据,并获取更新行数 +updateData = true;//updateData为true +break; +default: +throw new IllegalArgumentException("Unknown URI " + uri);//如果Uri不匹配则抛异常 +} +if (count > 0) {//如果更新行数大于0 +if (updateData) {//如果是Data表 +getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);//调用notifyChange方法,通知Uri已经被更改 +} +getContext().getContentResolver().notifyChange(uri, null);//调用notifyChange方法,通知Uri已经被更改 +} +return count;//返回更新行数 +} - mHelper.getWritableDatabase().execSQL(sql.toString()); - } +private String parseSelection(String selection) { +return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");//解析选择条件 +} - @Override - public String getType(Uri uri) { - // TODO Auto-generated method stub - return null; - } +private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { +StringBuilder sql = new StringBuilder(120);//创建一个StringBuilder +sql.append("UPDATE "); +sql.append(TABLE.NOTE);//更新Note表 +sql.append(" SET "); +sql.append(NoteColumns.VERSION); +sql.append("=" + NoteColumns.VERSION + "+1 ");//版本号加1 +if (id > 0 || !TextUtils.isEmpty(selection)) {//如果id大于0或有选择条件 +sql.append(" WHERE ");//添加WHERE子句 +} +if (id > 0) {//如果id大于0 +sql.append(NoteColumns.ID + "=" + String.valueOf(id));//更新对应的id +} +if (!TextUtils.isEmpty(selection)) {//如果选择条件不为空 +String selectString = id > 0 ? parseSelection(selection) : selection; +for (String args : selectionArgs) { +selectString = selectString.replaceFirst("\?", args); +} +sql.append(selectString);//解析选择条件并添加进sql中 +} +mHelper.getWritableDatabase().execSQL(sql.toString());//执行sql语句 +} +@Override +public String getType(Uri uri) { +// TODO Auto-generated method stub +return null;//返回空类型 } +