diff --git a/src/data/Contact.java b/src/data/Contact.java index d97ac5d..5f2dfc3 100644 --- a/src/data/Contact.java +++ b/src/data/Contact.java @@ -25,10 +25,14 @@ import android.util.Log; import java.util.HashMap; +// 定义一个名为Contact的公共类 public class Contact { + // 定义一个静态的HashMap对象sContactCache,用于缓存联系人信息 private static HashMap sContactCache; + // 定义一个静态的字符串TAG,用于日志标记 private static final String TAG = "Contact"; + // 定义一个静态字符串CALLER_ID_SELECTION,用于构建查询联系人时的SQL选择条件 private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + " AND " + Data.RAW_CONTACT_ID + " IN " @@ -36,36 +40,50 @@ public class Contact { + " FROM phone_lookup" + " WHERE min_match = '+')"; + // 定义一个静态方法getContact,接受Context对象和String类型的phoneNumber参数,返回联系人姓名 public static String getContact(Context context, String phoneNumber) { + // 如果sContactCache为null,则初始化一个新的HashMap对象 if(sContactCache == null) { sContactCache = new HashMap(); } + // 检查缓存中是否已经存在给定的电话号码对应的联系人姓名 if(sContactCache.containsKey(phoneNumber)) { + // 如果存在,则直接从缓存中获取并返回该姓名 return sContactCache.get(phoneNumber); } + // 将CALLER_ID_SELECTION字符串中的'+'替换为给定电话号码的最小匹配值,生成实际的SQL查询条件 String selection = CALLER_ID_SELECTION.replace("+", PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + + // 使用context.getContentResolver().query方法查询联系人数据库,查找与给定电话号码匹配的联系人姓名 Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, - selection, - new String[] { phoneNumber }, - null); + Data.CONTENT_URI, // 联系人数据的URI + new String [] { Phone.DISPLAY_NAME }, // 我们只关心联系人的显示名称 + selection, // 我们构建的查询条件 + new String[] { phoneNumber }, // 查询参数 + null); // 没有指定排序方式 + // 检查查询结果是否存在,并尝试获取联系人姓名 if (cursor != null && cursor.moveToFirst()) { try { + // 从游标中获取联系人姓名 String name = cursor.getString(0); + // 将获取到的姓名存入缓存 sContactCache.put(phoneNumber, name); + // 返回联系人姓名 return name; } catch (IndexOutOfBoundsException e) { - Log.e(TAG, " Cursor get string error " + e.toString()); + // 如果发生IndexOutOfBoundsException异常,记录错误日志并返回null + Log.e(TAG, "Cursor get string error " + e.toString()); return null; } finally { + // 无论是否找到联系人,都会关闭游标以释放资源 cursor.close(); } } else { + // 如果查询结果为空或没有找到匹配的联系人,记录一条调试信息并返回null Log.d(TAG, "No contact matched with number:" + phoneNumber); return null; } diff --git a/src/data/Notes.java b/src/data/Notes.java index 8dbd28e..2d021fb 100644 --- a/src/data/Notes.java +++ b/src/data/Notes.java @@ -14,107 +14,143 @@ * limitations under the License. */ -package net.micode.notes.data;//ahuahcac +package net.micode.notes.data; // 定义这个Java类的包名,表示这个类属于net.micode.notes.data包 -import android.net.Uri;//jajciacuahc +import android.net.Uri; // 导入Android的Uri类,用于表示统一资源标识符 + +// 定义一个名为Notes的公共类 public class Notes { + // 定义一个静态的字符串AUTHORITY,表示内容提供者的权限 public static final String AUTHORITY = "micode_notes"; + // 定义一个静态的字符串TAG,用于日志标记 public static final String TAG = "Notes"; + // 定义静态常量TYPE_NOTE,表示笔记类型 public static final int TYPE_NOTE = 0; + // 定义静态常量TYPE_FOLDER,表示文件夹类型 public static final int TYPE_FOLDER = 1; + // 定义静态常量TYPE_SYSTEM,表示系统类型 public static final int TYPE_SYSTEM = 2; /** - * Following IDs are system folders' identifiers - * {@link Notes#ID_ROOT_FOLDER } is default folder - * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder - * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records + * 以下ID是系统文件夹的标识符 + * {@link Notes#ID_ROOT_FOLDER } 是默认文件夹 + * {@link Notes#ID_TEMPARAY_FOLDER } 用于存放没有文件夹的笔记 + * {@link Notes#ID_CALL_RECORD_FOLDER} 用于存放通话记录 */ + // 定义静态常量ID_ROOT_FOLDER,表示默认文件夹的ID public static final int ID_ROOT_FOLDER = 0; + // 定义静态常量ID_TEMPARAY_FOLDER,表示临时文件夹的ID public static final int ID_TEMPARAY_FOLDER = -1; + // 定义静态常量ID_CALL_RECORD_FOLDER,表示通话记录文件夹的ID public static final int ID_CALL_RECORD_FOLDER = -2; + // 定义静态常量ID_TRASH_FOLER,表示回收站文件夹的ID public static final int ID_TRASH_FOLER = -3; + // 定义静态字符串INTENT_EXTRA_ALERT_DATE,用于Intent传递提醒日期 public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; + // 定义静态字符串INTENT_EXTRA_BACKGROUND_ID,用于Intent传递背景颜色ID public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; + // 定义静态字符串INTENT_EXTRA_WIDGET_ID,用于Intent传递小部件ID public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; + // 定义静态字符串INTENT_EXTRA_WIDGET_TYPE,用于Intent传递小部件类型 public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; + // 定义静态字符串INTENT_EXTRA_FOLDER_ID,用于Intent传递文件夹ID public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; + // 定义静态字符串INTENT_EXTRA_CALL_DATE,用于Intent传递通话日期 public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; + // 定义静态常量TYPE_WIDGET_INVALIDE,表示无效的小部件类型 public static final int TYPE_WIDGET_INVALIDE = -1; + // 定义静态常量TYPE_WIDGET_2X,表示2x小部件类型 public static final int TYPE_WIDGET_2X = 0; + // 定义静态常量TYPE_WIDGET_4X,表示4x小部件类型 public static final int TYPE_WIDGET_4X = 1; + // 定义一个内部静态类DataConstants,用于存储数据常量 public static class DataConstants { + // 定义静态字符串NOTE,表示文本笔记的内容类型 public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; + // 定义静态字符串CALL_NOTE,表示通话笔记的内容类型 public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; } /** * Uri to query all notes and folders + * 用于查询所有笔记和文件夹的Uri */ + // 定义静态Uri CONTENT_NOTE_URI,用于查询所有笔记和文件夹 public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); /** * Uri to query data + * 用于查询数据的Uri */ + // 定义静态Uri CONTENT_DATA_URI,用于查询数据 public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + // 定义一个接口NoteColumns,包含笔记和文件夹的列定义 public interface NoteColumns { /** * The unique ID for a row *

Type: INTEGER (long)

*/ + // 定义静态字符串ID,表示唯一标识符 public static final String ID = "_id"; /** * The parent's id for note or folder *

Type: INTEGER (long)

*/ + // 定义静态字符串PARENT_ID,表示父文件夹的ID public static final String PARENT_ID = "parent_id"; /** * Created data for note or folder *

Type: INTEGER (long)

*/ + // 定义静态字符串CREATED_DATE,表示创建日期 public static final String CREATED_DATE = "created_date"; /** * Latest modified date *

Type: INTEGER (long)

*/ + // 定义静态字符串MODIFIED_DATE,表示最新修改日期 public static final String MODIFIED_DATE = "modified_date"; - /** * Alert date *

Type: INTEGER (long)

*/ + // 定义静态字符串ALERTED_DATE,表示提醒日期 public static final String ALERTED_DATE = "alert_date"; /** * Folder's name or text content of note *

Type: TEXT

*/ + // 定义静态字符串SNIPPET,表示文件夹名称或笔记文本内容 public static final String SNIPPET = "snippet"; /** * Note's widget id *

Type: INTEGER (long)

*/ + // 定义静态字符串WIDGET_ID,表示笔记的小部件ID public static final String WIDGET_ID = "widget_id"; /** * Note's widget type *

Type: INTEGER (long)

*/ + // 定义静态字符串WIDGET_TYPE,表示笔记的小部件类型 public static final String WIDGET_TYPE = "widget_type"; /** * Note's background color's id *

Type: INTEGER (long)

*/ + // 定义静态字符串BG_COLOR_ID,表示笔记的背景颜色ID public static final String BG_COLOR_ID = "bg_color_id"; /** @@ -122,94 +158,109 @@ public class Notes { * note, it has at least one attachment *

Type: INTEGER

*/ + // 定义静态字符串HAS_ATTACHMENT,表示笔记是否有附件 public static final String HAS_ATTACHMENT = "has_attachment"; /** * Folder's count of notes *

Type: INTEGER (long)

*/ + // 定义静态字符串NOTES_COUNT,表示文件夹中的笔记数量 public static final String NOTES_COUNT = "notes_count"; /** * The file type: folder or note *

Type: INTEGER

*/ + // 定义静态字符串TYPE,表示文件类型(文件夹或笔记) public static final String TYPE = "type"; /** * The last sync id *

Type: INTEGER (long)

*/ + // 定义静态字符串SYNC_ID,表示最后一次同步的ID public static final String SYNC_ID = "sync_id"; /** * Sign to indicate local modified or not *

Type: INTEGER

*/ + // 定义静态字符串LOCAL_MODIFIED,表示是否本地修改 public static final String LOCAL_MODIFIED = "local_modified"; /** * Original parent id before moving into temporary folder *

Type : INTEGER

*/ + // 定义静态字符串ORIGIN_PARENT_ID,表示移动到临时文件夹之前的原始父文件夹ID public static final String ORIGIN_PARENT_ID = "origin_parent_id"; /** * The gtask id *

Type : TEXT

*/ + // 定义静态字符串GTASK_ID,表示Google任务的ID public static final String GTASK_ID = "gtask_id"; /** * The version code *

Type : INTEGER (long)

*/ + // 定义静态字符串VERSION,表示版本号 public static final String VERSION = "version"; } + // 定义一个接口DataColumns,包含数据的列定义 public interface DataColumns { /** * The unique ID for a row *

Type: INTEGER (long)

*/ + // 定义静态字符串ID,表示唯一标识符 public static final String ID = "_id"; /** * The MIME type of the item represented by this row. *

Type: Text

*/ + // 定义静态字符串MIME_TYPE,表示数据项的MIME类型 public static final String MIME_TYPE = "mime_type"; /** * The reference id to note that this data belongs to *

Type: INTEGER (long)

*/ + // 定义静态字符串NOTE_ID,表示数据所属的笔记ID public static final String NOTE_ID = "note_id"; /** * Created data for note or folder *

Type: INTEGER (long)

*/ + // 定义静态字符串CREATED_DATE,表示创建日期 public static final String CREATED_DATE = "created_date"; /** * Latest modified date *

Type: INTEGER (long)

*/ + // 定义静态字符串MODIFIED_DATE,表示最新修改日期 public static final String MODIFIED_DATE = "modified_date"; /** * Data's content *

Type: TEXT

*/ + // 定义静态字符串CONTENT,表示数据的内容 public static final String CONTENT = "content"; - /** * Generic data column, the meaning is {@link #MIMETYPE} specific, used for * integer data type *

Type: INTEGER

*/ + // 定义静态字符串DATA1,表示通用数据列,用于整数数据类型 public static final String DATA1 = "data1"; /** @@ -217,6 +268,7 @@ public class Notes { * integer data type *

Type: INTEGER

*/ + // 定义静态字符串DATA2,表示通用数据列,用于整数数据类型 public static final String DATA2 = "data2"; /** @@ -224,6 +276,7 @@ public class Notes { * TEXT data type *

Type: TEXT

*/ + // 定义静态字符串DATA3,表示通用数据列,用于文本数据类型 public static final String DATA3 = "data3"; /** @@ -231,6 +284,7 @@ public class Notes { * TEXT data type *

Type: TEXT

*/ + // 定义静态字符串DATA4,表示通用数据列,用于文本数据类型 public static final String DATA4 = "data4"; /** @@ -238,42 +292,56 @@ public class Notes { * TEXT data type *

Type: TEXT

*/ + // 定义静态字符串DATA5,表示通用数据列,用于文本数据类型 public static final String DATA5 = "data5"; } + // 定义一个静态内部类TextNote,继承自DataColumns,用于表示文本笔记 public static final class TextNote implements DataColumns { /** * Mode to indicate the text in check list mode or not *

Type: Integer 1:check list mode 0: normal mode

*/ + // 定义静态字符串MODE,表示文本模式(检查列表模式或正常模式) public static final String MODE = DATA1; + // 定义静态常量MODE_CHECK_LIST,表示检查列表模式 public static final int MODE_CHECK_LIST = 1; + // 定义静态字符串CONTENT_TYPE,表示文本笔记的内容类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; + // 定义静态字符串CONTENT_ITEM_TYPE,表示文本笔记的单个项内容类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; + // 定义静态Uri CONTENT_URI,用于查询文本笔记 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } + // 定义一个静态内部类CallNote,继承自DataColumns,用于表示通话笔记 public static final class CallNote implements DataColumns { /** * Call date for this record *

Type: INTEGER (long)

*/ + // 定义静态字符串CALL_DATE,表示通话记录的日期 public static final String CALL_DATE = DATA1; /** * Phone number for this record *

Type: TEXT

*/ + // 定义静态字符串PHONE_NUMBER,表示通话记录的电话号码 public static final String PHONE_NUMBER = DATA3; + // 定义静态字符串CONTENT_TYPE,表示通话笔记的内容类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; + // 定义静态字符串CONTENT_ITEM_TYPE,表示通话笔记的单个项内容类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; + // 定义静态Uri CONTENT_URI,用于查询通话笔记 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); } } + diff --git a/src/data/NotesDatabaseHelper.java b/src/data/NotesDatabaseHelper.java index ffe5d57..c203aed 100644 --- a/src/data/NotesDatabaseHelper.java +++ b/src/data/NotesDatabaseHelper.java @@ -14,34 +14,42 @@ * limitations under the License. */ -package net.micode.notes.data; +package net.micode.notes.data; // 定义这个Java类的包名,表示这个类属于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; - -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; +import android.content.ContentValues; // 导入Android的ContentValues类,用于存储键值对的数据 +import android.content.Context; // 导入Android的Context类,用于访问应用程序环境 +import android.database.sqlite.SQLiteDatabase; // 导入Android的SQLiteDatabase类,用于操作SQLite数据库 +import android.database.sqlite.SQLiteOpenHelper; // 导入Android的SQLiteOpenHelper类,用于管理数据库的创建和版本管理 +import android.util.Log; // 导入Android的Log类,用于记录日志信息 +import net.micode.notes.data.Notes.DataColumns; // 导入Notes类中的DataColumns接口 +import net.micode.notes.data.Notes.DataConstants; // 导入Notes类中的DataConstants类 +import net.micode.notes.data.Notes.NoteColumns; // 导入Notes类中的NoteColumns接口 +// 定义一个名为NotesDatabaseHelper的公共类,继承自SQLiteOpenHelper public class NotesDatabaseHelper extends SQLiteOpenHelper { + // 定义静态字符串DB_NAME,表示数据库名称 private static final String DB_NAME = "note.db"; + // 定义静态常量DB_VERSION,表示数据库版本 private static final int DB_VERSION = 4; + // 定义一个接口TABLE,包含表的名称 public interface TABLE { + // 定义静态字符串NOTE,表示笔记表的名称 public static final String NOTE = "note"; + // 定义静态字符串DATA,表示数据表的名称 public static final String DATA = "data"; } + // 定义静态字符串TAG,用于日志标记 private static final String TAG = "NotesDatabaseHelper"; + // 定义静态NotesDatabaseHelper对象mInstance,用于单例模式 private static NotesDatabaseHelper mInstance; + // 定义静态字符串CREATE_NOTE_TABLE_SQL,用于创建笔记表的SQL语句 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -63,6 +71,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + ")"; + // 定义静态字符串CREATE_DATA_TABLE_SQL,用于创建数据表的SQL语句 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + @@ -78,15 +87,17 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + ")"; + // 定义静态字符串CREATE_DATA_NOTE_ID_INDEX_SQL,用于创建数据表中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 + ");"; /** * 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 "+ + "CREATE TRIGGER increase_folder_count_on_update " + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + " BEGIN " + " UPDATE " + TABLE.NOTE + @@ -96,6 +107,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -104,11 +116,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + + " 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 " + @@ -121,6 +134,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -134,6 +148,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -147,6 +162,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has changed + * 当类型为{@link DataConstants#NOTE}的数据发生变化时,更新笔记的内容 */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + @@ -160,6 +176,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted + * 当类型为{@link DataConstants#NOTE}的数据被删除时,更新笔记的内容为空 */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete " + @@ -173,6 +190,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -184,6 +202,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -195,6 +214,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * 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 " + @@ -206,18 +226,27 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " END"; + // 定义一个构造函数,接受Context对象 public NotesDatabaseHelper(Context context) { + // 调用父类SQLiteOpenHelper的构造函数,传入数据库名称、版本号等参数 super(context, DB_NAME, null, DB_VERSION); } + // 定义一个方法createNoteTable,用于创建笔记表 public void createNoteTable(SQLiteDatabase db) { + // 执行创建笔记表的SQL语句 db.execSQL(CREATE_NOTE_TABLE_SQL); + // 重新创建笔记表的触发器 reCreateNoteTableTriggers(db); + // 创建系统文件夹 createSystemFolder(db); + // 记录日志信息,表示笔记表已创建 Log.d(TAG, "note table has been created"); } + // 定义一个方法reCreateNoteTableTriggers,用于重新创建笔记表的触发器 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"); @@ -226,6 +255,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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); @@ -235,127 +265,178 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } + // 定义一个方法createSystemFolder,用于创建系统文件夹 private void createSystemFolder(SQLiteDatabase db) { + // 创建一个ContentValues对象,用于存储键值对的数据 ContentValues values = new ContentValues(); /** - * call record foler for call notes + * call record folder for call notes + * 通话记录文件夹,用于存放通话笔记 */ + // 设置ID为通话记录文件夹的ID 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 + * 根文件夹,作为默认文件夹 */ + // 清空ContentValues对象 values.clear(); + // 设置ID为根文件夹的ID 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 + * 临时文件夹,用于移动笔记 */ + // 清空ContentValues对象 values.clear(); + // 设置ID为临时文件夹的ID values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); + // 设置类型为系统类型 values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // 将数据插入到笔记表中 db.insert(TABLE.NOTE, null, values); /** * create trash folder + * 创建回收站文件夹 */ + // 清空ContentValues对象 values.clear(); + // 设置ID为回收站文件夹的ID values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + // 设置类型为系统类型 values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // 将数据插入到笔记表中 db.insert(TABLE.NOTE, null, values); } + // 定义一个方法createDataTable,用于创建数据表 public void createDataTable(SQLiteDatabase db) { + // 执行创建数据表的SQL语句 db.execSQL(CREATE_DATA_TABLE_SQL); + // 重新创建数据表的触发器 reCreateDataTableTriggers(db); + // 创建note_id索引 db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); + // 记录日志信息,表示数据表已创建 Log.d(TAG, "data table has been created"); } + // 定义一个方法reCreateDataTableTriggers,用于重新创建数据表的触发器 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); } + // 定义一个静态同步方法getInstance,用于获取NotesDatabaseHelper的单例实例 static synchronized NotesDatabaseHelper getInstance(Context context) { + // 如果mInstance为null,则初始化一个新的NotesDatabaseHelper对象 if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } + // 返回单例实例 return mInstance; } + // 重写父类SQLiteOpenHelper的onCreate方法,用于创建数据库表 @Override public void onCreate(SQLiteDatabase db) { + // 创建笔记表 createNoteTable(db); + // 创建数据表 createDataTable(db); } + // 重写父类SQLiteOpenHelper的onUpgrade方法,用于处理数据库升级 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - boolean reCreateTriggers = false; - boolean skipV2 = false; + boolean reCreateTriggers = false; // 标记是否需要重新创建触发器 + boolean skipV2 = false; // 标记是否跳过v2版本的升级 + // 如果当前版本是v1,则升级到v2 if (oldVersion == 1) { upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to v3 - oldVersion++; + skipV2 = true; // 这次升级包括从v2到v3的升级 + oldVersion++; // 增加版本号 } + // 如果当前版本是v2且没有跳过v2版本的升级,则升级到v3 if (oldVersion == 2 && !skipV2) { upgradeToV3(db); - reCreateTriggers = true; - oldVersion++; + reCreateTriggers = true; // 标记需要重新创建触发器 + oldVersion++; // 增加版本号 } + // 如果当前版本是v3,则升级到v4 if (oldVersion == 3) { upgradeToV4(db); - oldVersion++; + oldVersion++; // 增加版本号 } + // 如果需要重新创建触发器,则调用相应的方法 if (reCreateTriggers) { reCreateNoteTableTriggers(db); reCreateDataTableTriggers(db); } + // 如果版本号不匹配,则抛出异常 if (oldVersion != newVersion) { - throw new IllegalStateException("Upgrade notes database to version " + newVersion - + "fails"); + throw new IllegalStateException("Upgrade notes database to version " + newVersion + " fails"); } } + // 定义一个方法upgradeToV2,用于将数据库从v1升级到v2 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); } + // 定义一个方法upgradeToV3,用于将数据库从v2升级到v3 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 + + // 在笔记表中添加一个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(); + // 设置ID为回收站文件夹的ID values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + // 设置类型为系统类型 values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // 将数据插入到笔记表中 db.insert(TABLE.NOTE, null, values); } + // 定义一个方法upgradeToV4,用于将数据库从v3升级到v4 private void upgradeToV4(SQLiteDatabase db) { + // 在笔记表中添加一个version列 db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); } diff --git a/src/data/NotesProvider.java b/src/data/NotesProvider.java index edb0a60..4c13a4f 100644 --- a/src/data/NotesProvider.java +++ b/src/data/NotesProvider.java @@ -14,42 +14,51 @@ * limitations under the License. */ -package net.micode.notes.data; +package net.micode.notes.data; // 定义这个Java类的包名,表示这个类属于net.micode.notes.data包 +import android.app.SearchManager; // 导入Android的SearchManager类,用于管理搜索功能 +import android.content.ContentProvider; // 导入Android的ContentProvider类,用于提供数据 +import android.content.ContentUris; // 导入Android的ContentUris类,用于处理Uri +import android.content.ContentValues; // 导入Android的ContentValues类,用于存储键值对的数据 +import android.content.Intent; // 导入Android的Intent类,用于处理应用程序之间的消息传递 +import android.content.UriMatcher; // 导入Android的UriMatcher类,用于匹配Uri +import android.database.Cursor; // 导入Android的Cursor类,用于处理数据库查询结果 +import android.database.sqlite.SQLiteDatabase; // 导入Android的SQLiteDatabase类,用于操作SQLite数据库 +import android.net.Uri; // 导入Android的Uri类,用于表示统一资源标识符 +import android.text.TextUtils; // 导入Android的TextUtils类,用于处理字符串 +import android.util.Log; // 导入Android的Log类,用于记录日志信息 -import android.app.SearchManager; -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; - +import net.micode.notes.R; // 导入应用程序的资源类R +import net.micode.notes.data.Notes.DataColumns; // 导入Notes类中的DataColumns接口 +import net.micode.notes.data.Notes.NoteColumns; // 导入Notes类中的NoteColumns接口 +import net.micode.notes.data.NotesDatabaseHelper.TABLE; // 导入NotesDatabaseHelper类中的TABLE接口 +// 定义一个名为NotesProvider的公共类,继承自ContentProvider public class NotesProvider extends ContentProvider { + // 定义一个静态的UriMatcher对象mMatcher,用于匹配Uri private static final UriMatcher mMatcher; + // 定义一个NotesDatabaseHelper对象mHelper,用于数据库操作 private NotesDatabaseHelper mHelper; + // 定义一个静态的字符串TAG,用于日志标记 private static final String TAG = "NotesProvider"; + // 定义静态常量URI_NOTE,表示笔记表的Uri private static final int URI_NOTE = 1; + // 定义静态常量URI_NOTE_ITEM,表示单个笔记项的Uri private static final int URI_NOTE_ITEM = 2; + // 定义静态常量URI_DATA,表示数据表的Uri private static final int URI_DATA = 3; + // 定义静态常量URI_DATA_ITEM,表示单个数据项的Uri private static final int URI_DATA_ITEM = 4; + // 定义静态常量URI_SEARCH,表示搜索的Uri private static final int URI_SEARCH = 5; + // 定义静态常量URI_SEARCH_SUGGEST,表示搜索建议的Uri private static final int URI_SEARCH_SUGGEST = 6; + // 静态代码块,初始化UriMatcher对象 static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); @@ -64,7 +73,9 @@ public class NotesProvider extends ContentProvider { /** * 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. + * x'0A' 在SQLite中表示换行符。在搜索结果中,我们将去除换行符和空白字符以显示更多信息。 */ + // 定义静态字符串NOTES_SEARCH_PROJECTION,用于搜索查询的投影 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 + "," @@ -73,218 +84,280 @@ public class NotesProvider extends ContentProvider { + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + // 定义静态字符串NOTES_SNIPPET_SEARCH_QUERY,用于搜索查询的SQL语句 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; + // 重写父类ContentProvider的onCreate方法,用于初始化数据库帮助类 @Override public boolean onCreate() { + // 获取NotesDatabaseHelper的单例实例 mHelper = NotesDatabaseHelper.getInstance(getContext()); + // 返回true表示初始化成功 return true; } + // 重写父类ContentProvider的query方法,用于根据Uri查询数据 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - Cursor c = null; - SQLiteDatabase db = mHelper.getReadableDatabase(); - String id = null; + Cursor c = null; // 定义一个Cursor对象c,用于存储查询结果 + SQLiteDatabase db = mHelper.getReadableDatabase(); // 获取可读的SQLiteDatabase对象 + String id = null; // 定义一个字符串id,用于存储Uri中的ID + + // 根据Uri匹配不同的查询逻辑 switch (mMatcher.match(uri)) { case URI_NOTE: - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); + // 查询所有笔记 + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); break; case URI_NOTE_ITEM: + // 获取Uri中的ID id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); + // 查询单个笔记项 + 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); + // 查询所有数据项 + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); break; case URI_DATA_ITEM: + // 获取Uri中的ID id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); + // 查询单个数据项 + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs, null, null, sortOrder); break; case URI_SEARCH: case URI_SEARCH_SUGGEST: + // 检查是否指定了sortOrder、selection、selectionArgs或projection if (sortOrder != null || projection != null) { throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); + "do not specify sortOrder, selection, selectionArgs, or projection" + " with this query"); } - String searchString = null; + String searchString = null; // 定义一个字符串searchString,用于存储搜索字符串 + // 如果是搜索建议Uri,则获取搜索字符串 if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { if (uri.getPathSegments().size() > 1) { searchString = uri.getPathSegments().get(1); } } else { + // 否则,从查询参数中获取搜索字符串 searchString = uri.getQueryParameter("pattern"); } + // 如果搜索字符串为空,则返回null if (TextUtils.isEmpty(searchString)) { return null; } try { + // 格式化搜索字符串,添加通配符 searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); + // 执行搜索查询 + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[] { searchString }); } catch (IllegalStateException ex) { + // 记录异常日志 Log.e(TAG, "got exception: " + ex.toString()); } break; default: + // 如果Uri不匹配,则抛出异常 throw new IllegalArgumentException("Unknown URI " + uri); } + + // 如果查询结果不为空,则设置通知Uri if (c != null) { c.setNotificationUri(getContext().getContentResolver(), uri); } + // 返回查询结果 return c; } + // 重写父类ContentProvider的insert方法,用于插入数据 @Override public Uri insert(Uri uri, ContentValues values) { - SQLiteDatabase db = mHelper.getWritableDatabase(); - long dataId = 0, noteId = 0, insertedId = 0; + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写的SQLiteDatabase对象 + long dataId = 0, noteId = 0, insertedId = 0; // 定义长整型变量dataId、noteId和insertedId,用于存储插入的数据ID和笔记ID + + // 根据Uri匹配不同的插入逻辑 switch (mMatcher.match(uri)) { case URI_NOTE: + // 插入笔记 insertedId = noteId = db.insert(TABLE.NOTE, null, values); break; case URI_DATA: + // 检查ContentValues中是否包含note_id if (values.containsKey(DataColumns.NOTE_ID)) { noteId = values.getAsLong(DataColumns.NOTE_ID); } else { + // 如果没有note_id,则记录日志信息 Log.d(TAG, "Wrong data format without note id:" + values.toString()); } + // 插入数据项 insertedId = dataId = db.insert(TABLE.DATA, null, values); break; default: + // 如果Uri不匹配,则抛出异常 throw new IllegalArgumentException("Unknown URI " + uri); } - // Notify the note uri + + // 通知笔记Uri的变化 if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); } - // Notify the data uri + // 通知数据Uri的变化 if (dataId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); } + // 返回插入数据的Uri return ContentUris.withAppendedId(uri, insertedId); } + // 重写父类ContentProvider的delete方法,用于删除数据 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean deleteData = false; + int count = 0; // 定义整型变量count,用于存储删除的行数 + String id = null; // 定义一个字符串id,用于存储Uri中的ID + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写的SQLiteDatabase对象 + boolean deleteData = false; // 定义布尔型变量deleteData,用于标记是否删除数据项 + + // 根据Uri匹配不同的删除逻辑 switch (mMatcher.match(uri)) { case URI_NOTE: + // 添加条件以确保ID大于0 selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; + // 删除笔记 count = db.delete(TABLE.NOTE, selection, selectionArgs); break; case URI_NOTE_ITEM: + // 获取Uri中的ID id = uri.getPathSegments().get(1); /** * ID that smaller than 0 is system folder which is not allowed to * trash + * ID 小于 0 表示系统文件夹,不允许移动到回收站 */ long noteId = Long.valueOf(id); if (noteId <= 0) { break; } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); + // 删除单个笔记项 + 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: + // 获取Uri中的ID id = uri.getPathSegments().get(1); - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); + // 删除单个数据项 + count = db.delete(TABLE.DATA, DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); deleteData = true; break; default: + // 如果Uri不匹配,则抛出异常 throw new IllegalArgumentException("Unknown URI " + uri); } + + // 如果删除的行数大于0,则通知Uri的变化 if (count > 0) { if (deleteData) { getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); } getContext().getContentResolver().notifyChange(uri, null); } + // 返回删除的行数 return count; } + // 重写父类ContentProvider的update方法,用于更新数据 @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; + int count = 0; // 定义整型变量count,用于存储更新的行数 + String id = null; // 定义一个字符串id,用于存储Uri中的ID + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写的SQLiteDatabase对象 + boolean updateData = false; // 定义布尔型变量updateData,用于标记是否更新数据项 + + // 根据Uri匹配不同的更新逻辑 switch (mMatcher.match(uri)) { case URI_NOTE: + // 增加笔记版本号 increaseNoteVersion(-1, selection, selectionArgs); + // 更新笔记 count = db.update(TABLE.NOTE, values, selection, selectionArgs); break; case URI_NOTE_ITEM: + // 获取Uri中的ID id = uri.getPathSegments().get(1); + // 增加笔记版本号 increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(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: + // 获取Uri中的ID id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); + // 更新单个数据项 + count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); updateData = true; break; default: + // 如果Uri不匹配,则抛出异常 throw new IllegalArgumentException("Unknown URI " + uri); } + // 如果更新的行数大于0,则通知Uri的变化 if (count > 0) { if (updateData) { getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); } getContext().getContentResolver().notifyChange(uri, null); } + // 返回更新的行数 return count; } + // 定义一个方法parseSelection,用于处理selection字符串 private String parseSelection(String selection) { + // 如果selection不为空,则添加AND条件 return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } + // 定义一个方法increaseNoteVersion,用于增加笔记的版本号 private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { - StringBuilder sql = new StringBuilder(120); + StringBuilder sql = new StringBuilder(120); // 定义一个StringBuilder对象sql,用于构建SQL语句 + + // 构建更新笔记版本号的SQL语句 sql.append("UPDATE "); sql.append(TABLE.NOTE); sql.append(" SET "); sql.append(NoteColumns.VERSION); sql.append("=" + NoteColumns.VERSION + "+1 "); + // 如果id大于0或selection不为空,则添加WHERE条件 if (id > 0 || !TextUtils.isEmpty(selection)) { sql.append(" WHERE "); } + // 如果id大于0,则添加ID条件 if (id > 0) { sql.append(NoteColumns.ID + "=" + String.valueOf(id)); } + // 如果selection不为空,则添加selection条件 if (!TextUtils.isEmpty(selection)) { String selectString = id > 0 ? parseSelection(selection) : selection; for (String args : selectionArgs) { @@ -293,13 +366,14 @@ public class NotesProvider extends ContentProvider { sql.append(selectString); } + // 执行SQL语句以增加笔记版本号 mHelper.getWritableDatabase().execSQL(sql.toString()); } + // 重写父类ContentProvider的getType方法,用于返回Uri的数据类型 @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } - }