From 6f3dea8052409115157021eee2a9f18fbaa3a19a Mon Sep 17 00:00:00 2001 From: liuyuxia <13337357913@qq.com> Date: Fri, 10 Jan 2025 09:00:43 +0800 Subject: [PATCH] liuyuxia --- src/java/net/micode/notes/data/Contact.java | 89 ++-- src/java/net/micode/notes/data/Notes.java | 450 +++++------------- .../notes/data/NotesDatabaseHelper.java | 270 +++++------ .../net/micode/notes/data/NotesProvider.java | 211 +++----- 4 files changed, 357 insertions(+), 663 deletions(-) diff --git a/src/java/net/micode/notes/data/Contact.java b/src/java/net/micode/notes/data/Contact.java index 92953df..e4c22e9 100644 --- a/src/java/net/micode/notes/data/Contact.java +++ b/src/java/net/micode/notes/data/Contact.java @@ -25,71 +25,102 @@ import android.util.Log; import java.util.HashMap; -/** - * - * @ProjectName: minode - * @Package: net.micode.notes.data - * @ClassName: Contact - * @Description: 该类实现建立联系人数据库的功能 - * @Author: 齐景熙 - * @Date: 2024-12-20 19:42 - */ + +import android.content.Context; +import android.content.ContentResolver; +import android.database.Cursor; +import android.provider.ContactsContract; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Data; +import android.util.Log; +import android.telephony.PhoneNumberUtils; +import java.util.HashMap; + public class Contact { private static HashMap sContactCache; private static final String TAG = "Contact"; + // 用于查询联系人的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 " + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + "(SELECT raw_contact_id " + " FROM phone_lookup" + " WHERE min_match = '+')"; - /** - * @method getContact - * @description 该方法用于识别电话号码对应的联系人 - * @date: 2024-12-20 20:02 - * @author: 齐景熙 - * @return string - */ + + /** + * 根据电话号码获取联系人姓名。 + * + * @param context 应用上下文 + * @param phoneNumber 电话号码 + * @return 联系人姓名,如果未找到则返回null + */ public static String getContact(Context context, String phoneNumber) { - if(sContactCache == null) { + // 初始化联系人缓存 + if (sContactCache == null) { sContactCache = new HashMap(); } - // 查找HashMap中是否有phoneNumber的信息 - // 2024-12-20 20:04 - if(sContactCache.containsKey(phoneNumber)) { + // 检查缓存中是否已有该电话号码对应的联系人姓名 + if (sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } + // 替换SQL语句中的占位符为实际的电话号码匹配模式 String selection = CALLER_ID_SELECTION.replace("+", PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); - // 查找数据库中phoneNumber的信息 - // 2024-12-20 20:06 + // 查询联系人数据库 Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, + new String[]{Phone.DISPLAY_NAME}, selection, - new String[] { phoneNumber }, + new String[]{phoneNumber}, null); - // 检查是否查询到联系人,找到则将相关信息加入HashMap中,未找到则处理异常 - // 2024-12-20 20:07 + // 处理查询结果 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()); + // 日志记录错误 + Log.e(TAG, "Cursor get string error " + e.toString()); return null; } finally { + // 关闭游标 cursor.close(); } } else { + // 日志记录未找到匹配的联系人 Log.d(TAG, "No contact matched with number:" + phoneNumber); return null; } } } + +/** + * 类注释 +Contact 类用于根据电话号码查询联系人姓名。它使用一个静态缓存 sContactCache 来存储已查询过的电话号码和对应的联系人姓名,以提高查询效率。 +静态变量 +sContactCache:用于缓存电话号码和联系人姓名的映射。 +TAG:用于日志记录的标签。 +CALLER_ID_SELECTION:用于查询联系人的SQL语句,包含电话号码匹配和MIME类型过滤。 +getContact 方法 +参数 +context:当前应用的上下文。 +phoneNumber:需要查询的电话号码。 +返回值 +返回联系人姓名,如果未找到则返回null。 +功能 +首先检查缓存中是否已有该电话号码对应的联系人姓名,如果有则直接返回。 +如果缓存中没有,构造SQL查询语句,查询联系人数据库。 +如果查询到结果,将联系人姓名缓存起来并返回。 +如果未查询到结果,记录日志并返回null。 +异常处理 +使用try-catch块捕获IndexOutOfBoundsException,防止游标操作异常。 +使用finally块确保游标在使用后关闭,释放资源。 + */ \ No newline at end of file diff --git a/src/java/net/micode/notes/data/Notes.java b/src/java/net/micode/notes/data/Notes.java index 7079d8f..714e37f 100644 --- a/src/java/net/micode/notes/data/Notes.java +++ b/src/java/net/micode/notes/data/Notes.java @@ -15,49 +15,43 @@ */ -/** - * - * @ProjectName: minode - * @Package: net.micode.notes.data - * @ClassName: Notes - * @Description: 该类主要定义了与笔记相关的常量、枚举类型、接口和嵌套类,用于描述笔记的基本属性、类型、系统文件夹标识符、Intent、 - 额外数据键、小部件类型等,以及提供查询笔记和数据的 URI。它为笔记应用提供了数据结构和访问接口的基础框架,使得笔记 - 的创建、管理、查询等功能得以实现。 - * @Author: 齐景熙 - * @Date: 2024-12-21 19:42 - */ - - -/* - 主要成员变量和常量: -AUTHORITY:定义了内容提供者的权威名称,用于构建 URI。 -TAG:用于日志记录的标签。 -TYPE_NOTE、TYPE_FOLDER、TYPE_SYSTEM:定义了笔记的类型枚举,分别表示普通笔记、文件夹和系统文件夹。 -ID_ROOT_FOLDER、ID_TEMPARAY_FOLDER、ID_CALL_RECORD_FOLDER、ID_TRASH_FOLER:定义了系统文件夹的标识符,分别表示根文件夹、临时文件夹、通话记录文件夹和回收站文件夹。 -INTENT_EXTRA_ALERT_DATE、INTENT_EXTRA_BACKGROUND_ID 等:定义了 Intent 额外数据的键,用于在 Intent 中传递相关数据。 -TYPE_WIDGET_INVALIDE、TYPE_WIDGET_2X、TYPE_WIDGET_4X:定义了小部件的类型枚举。 - */ package net.micode.notes.data; import android.net.Uri; + +/** + * Notes 类提供了便签应用中各种常量和 Uri 的定义。 + * 它包括便签类型、意图额外数据、小部件类型、数据常量、便签列和数据列的定义。 + */ public class Notes { + /** + * ContentProvider 的权威名称。 + */ public static final String AUTHORITY = "micode_notes"; + + /** + * 日志标签。 + */ public static final String TAG = "Notes"; - public static final int TYPE_NOTE = 0; - public static final int TYPE_FOLDER = 1; - 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 + * 便签类型常量。 + */ + public static final int TYPE_NOTE = 0; // 普通便签 + public static final int TYPE_FOLDER = 1; // 文件夹 + public static final int TYPE_SYSTEM = 2; // 系统便签 + + /** + * 特殊文件夹ID常量。 */ - public static final int ID_ROOT_FOLDER = 0; - public static final int ID_TEMPARAY_FOLDER = -1; - public static final int ID_CALL_RECORD_FOLDER = -2; - public static final int ID_TRASH_FOLER = -3; // TODO: 2023/12/25 有trash文件夹 + public static final int ID_ROOT_FOLDER = 0; // 根文件夹ID + public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹ID + public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹ID + public static final int ID_TRASH_FOLDER = -3; // 回收站文件夹ID + /** + * 意图额外数据的键。 + */ public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; @@ -65,343 +59,123 @@ public class Notes { public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; - public static final int TYPE_WIDGET_INVALIDE = -1; - public static final int TYPE_WIDGET_2X = 0; - public static final int TYPE_WIDGET_4X = 1; - - /** - * @method DataConstants - * @description 该嵌套类定义了笔记数据的常量,主要用于表示笔记数据的 MIME 类型。 - * @date: 2024-12-21 20:02 - * @author: 齐景熙 - */ + * 小部件类型常量。 + */ + public static final int TYPE_WIDGET_INVALID = -1; // 无效小部件类型 + public static final int TYPE_WIDGET_2X = 0; // 2x小部件 + public static final int TYPE_WIDGET_4X = 1; // 4x小部件 - /* - 主要成员变量和常量: - NOTE:表示文本笔记的 MIME 类型。 - CALL_NOTE:表示通话记录笔记的 MIME 类型。 - */ + /** + * 数据常量类,包含便签和通话记录的 MIME 类型。 + */ public static class DataConstants { - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 文本便签的 MIME 类型 + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话记录便签的 MIME 类型 } /** - * Uri to query all notes and folders + * 便签内容的 Uri。 */ public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); /** - * Uri to query data + * 数据内容的 Uri。 */ public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); - /** - * @method NoteColumns - * @description 该接口定义了笔记列的名称和类型,用于描述笔记的基本属性,如 ID、父 ID、创建日期、修改日期、 - 提醒日期、摘要、小部件 ID、小部件类型、背景颜色 ID、是否有附件、笔记数量、类型、同步 ID、 - 本地修改标志、原始父 ID、GTask ID、版本号、置顶状态等。这些列名称和类型为笔记数据的存储和查 - 询提供了标准的字段定义。 - * @date: 2024-12-21 20:04 - * @author: 齐景熙 - */ - - /* - 要成员变量和常量: - ID:笔记的唯一 ID。 - PARENT_ID:笔记或文件夹的父 ID。 - CREATED_DATE:笔记或文件夹的创建日期。 - MODIFIED_DATE:笔记或文件夹的最新修改日期。 - ALERTED_DATE:提醒日期。 - SNIPPET:文件夹的名称或笔记的文本内容。 - WIDGET_ID:笔记的小部件 ID。 - WIDGET_TYPE:笔记的小部件类型。 - BG_COLOR_ID:笔记的背景颜色 ID。 - HAS_ATTACHMENT:笔记是否有附件。 - NOTES_COUNT:文件夹的笔记数量。 - TYPE:文件类型(文件夹或笔记)。 - SYNC_ID:最后同步 ID。 - LOCAL_MODIFIED:本地修改标志。 - ORIGIN_PARENT_ID:移动到临时文件夹之前的原始父 ID。 - GTASK_ID:GTask ID。 - VERSION:版本号。 - TOP:置顶状态。 - */ + * 便签列的接口,定义了便签表中的列名。 + */ public interface NoteColumns { - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ - public static final String ID = "_id"; - - /** - * The parent's id for note or folder - *

Type: INTEGER (long)

- */ - public static final String PARENT_ID = "parent_id"; - - /** - * Created data for note or folder - *

Type: INTEGER (long)

- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date - *

Type: INTEGER (long)

- */ - public static final String MODIFIED_DATE = "modified_date"; - - - /** - * Alert date - *

Type: INTEGER (long)

- */ - public static final String ALERTED_DATE = "alert_date"; - - /** - * Folder's name or text content of note - *

Type: TEXT

- */ - public static final String SNIPPET = "snippet"; - - /** - * Note's widget id - *

Type: INTEGER (long)

- */ - public static final String WIDGET_ID = "widget_id"; - - /** - * Note's widget type - *

Type: INTEGER (long)

- */ - public static final String WIDGET_TYPE = "widget_type"; - - /** - * Note's background color's id - *

Type: INTEGER (long)

- */ - public static final String BG_COLOR_ID = "bg_color_id"; - - /** - * For text note, it doesn't has attachment, for multi-media - * note, it has at least one attachment - *

Type: INTEGER

- */ - public static final String HAS_ATTACHMENT = "has_attachment"; - - /** - * Folder's count of notes - *

Type: INTEGER (long)

- */ - public static final String NOTES_COUNT = "notes_count"; - - /** - * The file type: folder or note - *

Type: INTEGER

- */ - public static final String TYPE = "type"; - - /** - * The last sync id - *

Type: INTEGER (long)

- */ - public static final String SYNC_ID = "sync_id"; - - /** - * Sign to indicate local modified or not - *

Type: INTEGER

- */ - public static final String LOCAL_MODIFIED = "local_modified"; - - /** - * Original parent id before moving into temporary folder - *

Type : INTEGER

- */ - public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - - /** - * The gtask id - *

Type : TEXT

- */ - public static final String GTASK_ID = "gtask_id"; - - /** - * the version code - *

type : integer (long)

- */ - public static final String VERSION = "version"; - - /** - * set top state - *

type : integer (long)

- */ - public static final String TOP = "top"; + public static final String ID = "_id"; // 便签ID + public static final String PARENT_ID = "parent_id"; // 父文件夹ID + + public static final String CREATED_DATE = "created_date"; // 创建日期 + public static final String MODIFIED_DATE = "modified_date"; // 修改日期 + public static final String ALERTED_DATE = "alert_date"; // 提醒日期 + public static final String SNIPPET = "snippet"; // 便签摘要 + public static final String WIDGET_ID = "widget_id"; // 小部件ID + public static final String WIDGET_TYPE = "widget_type"; // 小部件类型 + public static final String BG_COLOR_ID = "bg_color_id"; // 背景颜色ID + public static final String HAS_ATTACHMENT = "has_attachment"; // 是否有附件 + public static final String NOTES_COUNT = "notes_count"; // 便签数量 + public static final String TYPE = "type"; // 便签类型 + public static final String SYNC_ID = "sync_id"; // 同步ID + public static final String LOCAL_MODIFIED = "local_modified"; // 本地修改标记 + public static final String ORIGIN_PARENT_ID = "origin_parent_id"; // 原始父文件夹ID + public static final String GTASK_ID = "gtask_id"; // Google 任务ID + public static final String VERSION = "version"; // 版本 + public static final String TOP = "top"; // 置顶标记 } - - /** - * @method DataColumns - * @description 该接口定义了数据列的名称和类型,用于描述数据的基本属性,如 ID、MIME 类型、所属笔记的 - ID、创建日期、修改日期、数据内容、通用数据列等。这些列名称和类型为数据的存储和查询提 - 供了标准的字段定义。 - * @date: 2024-12-21 20:05 - * @author: 齐景熙 - */ - - /* - 主要成员变量和常量: -ID:数据的唯一 ID。 -MIME_TYPE:数据项的 MIME 类型。 -NOTE_ID:数据所属笔记的 ID。 -CREATED_DATE:数据的创建日期。 -MODIFIED_DATE:数据的最新修改日期。 -CONTENT:数据的内容。 -DATA1、DATA2、DATA3、DATA4、DATA5:通用数据列,具体含义取决于 MIME 类型。 + /** + * 数据列的接口,定义了数据表中的列名。 */ public interface DataColumns { - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ - public static final String ID = "_id"; - - /** - * The MIME type of the item represented by this row. - *

Type: Text

- */ - public static final String MIME_TYPE = "mime_type"; - - /** - * The reference id to note that this data belongs to - *

Type: INTEGER (long)

- */ - public static final String NOTE_ID = "note_id"; - - /** - * Created data for note or folder - *

Type: INTEGER (long)

- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date - *

Type: INTEGER (long)

- */ - public static final String MODIFIED_DATE = "modified_date"; - - /** - * Data's content - *

Type: TEXT

- */ - public static final String CONTENT = "content"; - - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA1 = "data1"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA2 = "data2"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA3 = "data3"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA4 = "data4"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA5 = "data5"; + public static final String ID = "_id"; // 数据ID + public static final String MIME_TYPE = "mime_type"; // MIME 类型 + public static final String NOTE_ID = "note_id"; // 便签ID + public static final String CREATED_DATE = "created_date"; // 创建日期 + public static final String MODIFIED_DATE = "modified_date"; // 修改日期 + public static final String CONTENT = "content"; // 内容 + public static final String DATA1 = "data1"; // 数据1 + public static final String DATA2 = "data2"; // 数据2 + public static final String DATA3 = "data3"; // 数据3 + public static final String DATA4 = "data4"; // 数据4 + public static final String DATA5 = "data5"; // 数据5 } - - /** - * @method TextNote - * @description 该嵌套类实现了 DataColumns 接口,定义了文本笔记的特定属性和 MIME 类型。 - 它用于描述文本笔记的模式(如清单模式或普通模式)以及文本笔记的 MIME 类型和 URI。 - * @date: 2024-12-21 20:07 - * @author: 齐景熙 - */ - - /* -主要成员变量和常量: -MODE:文本笔记的模式,使用 DATA1 列来表示。 -MODE_CHECK_LIST:表示清单模式的值。 -CONTENT_TYPE:文本笔记的 MIME 类型,用于目录。 -CONTENT_ITEM_TYPE:文本笔记的 MIME 类型,用于单个项。 -CONTENT_URI:文本笔记的 URI,用于查询文本笔记数据。 + /** + * 文本便签类,实现了 DataColumns 接口,定义了文本便签的特定列和 Uri。 */ 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

- */ - public static final String MODE = DATA1; - - public static final int MODE_CHECK_LIST = 1; + public static final String MODE = DATA1; // 模式 - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; + public static final int MODE_CHECK_LIST = 1; // 检查列表模式 - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; // 文本便签的目录 MIME 类型 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; // 文本便签的项 MIME 类型 - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); // 文本便签的 Uri } /** - * @method CallNote - * @description 该嵌套类实现了 DataColumns 接口,定义了通话记录笔记的特定属性和 MIME 类型。它用于描述通 - 话记录笔记的通话日期、电话号码以及通话记录笔记的 MIME 类型和 URI。 - * @date: 2024-12-21 20:10 - * @author: 齐景熙 - */ - - - /* -主要成员变量和常量: -CALL_DATE:通话记录笔记的通话日期,使用 DATA1 列来表示。 -PHONE_NUMBER:通话记录笔记的电话号码,使用 DATA3 列来表示。 -CONTENT_TYPE:通话记录笔记的 MIME 类型,用于目录。 -CONTENT_ITEM_TYPE:通话记录笔记的 MIME 类型,用于单个项。 -CONTENT_URI:通话记录笔记的 URI,用于查询通话记录笔记数据。 + * 通话记录便签类,实现了 DataColumns 接口,定义了通话记录便签的特定列和 Uri。 */ public static final class CallNote implements DataColumns { - /** - * Call date for this record - *

Type: INTEGER (long)

- */ - public static final String CALL_DATE = DATA1; + public static final String CALL_DATE = DATA1; // 通话日期 + public static final String PHONE_NUMBER = DATA3; // 电话号码 - /** - * Phone number for this record - *

Type: TEXT

- */ - public static final String PHONE_NUMBER = DATA3; + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; // 通话记录便签的目录 MIME 类型 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; // 通话记录便签的项 MIME 类型 - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); // 通话记录便签的 Uri } } + + +/** + * 类注释 +Notes 类提供了便签应用中各种常量和 Uri 的定义。它包括便签类型、意图额外数据、小部件类型、数据常量、便签列和数据列的定义。 +常量定义 +AUTHORITY:ContentProvider 的权威名称。 +TAG:日志标签。 +TYPE_NOTE、TYPE_FOLDER、TYPE_SYSTEM:便签类型常量。 +ID_ROOT_FOLDER、ID_TEMPARAY_FOLDER、ID_CALL_RECORD_FOLDER、ID_TRASH_FOLDER:特殊文件夹ID常量。 +INTENT_EXTRA_*:意图额外数据的键。 +TYPE_WIDGET_INVALID、TYPE_WIDGET_2X、TYPE_WIDGET_4X:小部件类型常量。 +数据常量类 +DataConstants:包含便签和通话记录的 MIME 类型。 +Uri 定义 +CONTENT_NOTE_URI:便签内容的 Uri。 +CONTENT_DATA_URI:数据内容的 Uri。 +便签列接口 +NoteColumns:定义了便签表中的列名,包括便签ID、父文件夹ID、创建日期、修改日期、提醒日期、便签摘要、小部件ID、小部件类型、背景颜色ID、是否有附件、便签数量、便签类型、同步ID、本地修改标记、原始父文件夹ID、Google 任务ID、版本和置顶标记。 +数据列接口 +DataColumns:定义了数据表中的列名,包括数据ID、MIME 类型、便签ID、创建日期、修改日期、内容、数据1、数据2、数据3、数据4和数据5。 +文本便签类 +TextNote:实现了 DataColumns 接口,定义了文本便签的特定列和 Uri。包括模式、检查列表模式、目录 MIME 类型、项 MIME 类型和 Uri。 +通话记录便签类 +CallNote:实现了 DataColumns 接口,定义了通话记录便签的特定列和 Uri。包括通话日期、电话号码、目录 MIME 类型、项 MIME 类型和 Uri。 + */ \ No newline at end of file diff --git a/src/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/java/net/micode/notes/data/NotesDatabaseHelper.java index 2f9b0a3..77ab2df 100644 --- a/src/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -15,26 +15,6 @@ */ - /** - * - * @ProjectName: minode - * @Package: net.micode.notes.data - * @ClassName: NotesDatabaseHelper - * @Description: 该类继承自 SQLiteOpenHelper,用于创建和管理笔记应用的数据库。 - 它定义了数据库的名称、版本、表名、创建表和触发器的 SQL 语句,并 - 实现了数据库的创建、升级等操作。通过该类,可以方便地进行笔记数据的存储和管理。 - * @Author: 齐景熙 - * @Date: 2024-12-21 22:10 - */ - -/*主要成员变量和常量: -DB_NAME:数据库的名称。 -DB_VERSION:数据库的版本号。 -TABLE:定义了数据库表名的接口。 -TAG:用于日志记录的标签。 -mInstance:用于实现单例模式的静态实例变量。 -CREATE_NOTE_TABLE_SQL、CREATE_DATA_TABLE_SQL 等:创建笔记表和数据表的 SQL 语句。 -NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER 等:定义了数据库触发器的 SQL 语句,用于在特定操作后自动更新数据。 */ package net.micode.notes.data; import android.content.ContentValues; @@ -48,21 +28,36 @@ import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; -public class NotesDatabaseHelper extends SQLiteOpenHelper { - private static final String DB_NAME = "note.db"; +package net.micode.notes.data; - private static final int DB_VERSION = 5; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; - public interface TABLE { - public static final String NOTE = "note"; +/** + * NotesDatabaseHelper 类用于管理便签应用的数据库。 + * 它继承自 SQLiteOpenHelper,提供了数据库的创建、升级和版本管理功能。 + */ +public class NotesDatabaseHelper extends SQLiteOpenHelper { + private static final String DB_NAME = "note.db"; // 数据库文件名 + private static final int DB_VERSION = 5; // 数据库版本 - public static final String DATA = "data"; + /** + * 定义数据库表名的接口。 + */ + public interface TABLE { + public static final String NOTE = "note"; // 便签表名 + public static final String DATA = "data"; // 数据表名 } - private static final String TAG = "NotesDatabaseHelper"; + private static final String TAG = "NotesDatabaseHelper"; // 日志标签 - private static NotesDatabaseHelper mInstance; + private static NotesDatabaseHelper mInstance; // 单例对象 + /** + * 创建便签表的 SQL 语句。 + */ private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -85,6 +80,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.TOP + " INTEGER NOT NULL DEFAULT 0" + ")"; + /** + * 创建数据表的 SQL 语句。 + */ private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + @@ -100,15 +98,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { 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 + * 创建便签表的触发器,用于在更新便签的父文件夹ID时增加文件夹的便签计数。 */ 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 + @@ -117,7 +118,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " END"; /** - * Decrease folder's note count when move note from folder + * 创建便签表的触发器,用于在更新便签的父文件夹ID时减少文件夹的便签计数。 */ private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update " + @@ -130,7 +131,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 " + @@ -142,7 +143,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 " + @@ -155,7 +156,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " 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 " + @@ -168,7 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " 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 " + @@ -181,7 +182,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " 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 " + @@ -194,7 +195,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 " + @@ -205,7 +206,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 " + @@ -216,41 +217,30 @@ 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 " + " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + + " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLDER + " BEGIN" + " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLDER + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " END"; - /** - * @method NotesDatabaseHelper - * @description 构造函数,用于初始化 NotesDatabaseHelper 实例。调用父类的构造函数,传入上下文、 - 数据库名称、工厂和数据库版本号,完成数据库帮助者的创建。 - * @date: 2024-12-21 22:10 - * @author: 齐景熙 - */ - /*参数: -context:上下文对象,用于访问应用程序的资源和功能。 */ + * 构造函数。 + * @param context 应用上下文 + */ public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } /** - * @method createNoteTable - * @description 创建笔记表。执行创建笔记表的 SQL 语句,并调用 reCreateNoteTableTriggers 方法重新 - 创建笔记表的触发器,最后创建系统文件夹。 - * @date: 2024-12-21 22:13 - * @author: 齐景熙 - */ - /*参数: -db:可写的数据库对象,用于执行 SQL 语句。 */ + * 创建便签表。 + * @param db 数据库对象 + */ public void createNoteTable(SQLiteDatabase db) { db.execSQL(CREATE_NOTE_TABLE_SQL); reCreateNoteTableTriggers(db); @@ -258,16 +248,10 @@ db:可写的数据库对象,用于执行 SQL 语句。 */ Log.d(TAG, "note table has been created"); } - /** - * @method reCreateNoteTableTriggers - * @description 重新创建笔记表的触发器。先删除已存在的触发器,然后依次创建增加文件夹笔记数量、减少文件 - 夹笔记数量、删除笔记数据、移动笔记到回收站等触发器。 - * @date: 2024-12-21 22:15 - * @author: 齐景熙 - */ - /*参数: -db:可写的数据库对象,用于执行 SQL 语句。 */ + * 重新创建便签表的触发器。 + * @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"); @@ -287,55 +271,32 @@ db:可写的数据库对象,用于执行 SQL 语句。 */ } /** - * @method createSystemFolder - * @description 创建系统文件夹。使用 ContentValues 设置系统文件夹的 ID 和类型,然后依次插入通话记录 - 文件夹、根文件夹、临时文件夹和回收站文件夹到笔记表中。 - * @date: 2024-12-21 22:20 - * @author: 齐景熙 - */ - /*参数: -db:可写的数据库对象,用于执行插入操作。 */ + * 创建系统文件夹。 + * @param db 数据库对象 + */ 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.ID, Notes.ID_TRASH_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); } /** - * @method createDataTable - * @description 创建数据表。执行创建数据表的 SQL 语句,调用 reCreateDataTableTriggers 方法重新创建数据表的触发器,并创建数据表的索引。 - * @date: 2024-12-21 22:23 - * @author: 齐景熙 - */ + * 创建数据表。 + * @param db 数据库对象 + */ public void createDataTable(SQLiteDatabase db) { db.execSQL(CREATE_DATA_TABLE_SQL); reCreateDataTableTriggers(db); @@ -343,13 +304,10 @@ db:可写的数据库对象,用于执行插入操作。 */ Log.d(TAG, "data table has been created"); } - /** - * @method reCreateDataTableTriggers - * @description 重新创建数据表的触发器。先删除已存在的触发器,然后依次创建更新笔记内容的触发器。 - * @date: 2024-12-21 22:25 - * @author: 齐景熙 - */ + * 重新创建数据表的触发器。 + * @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"); @@ -361,11 +319,10 @@ db:可写的数据库对象,用于执行插入操作。 */ } /** - * @method getInstance - * @description 获取 NotesDatabaseHelper 的单例实例。如果实例不存在,则创建一个新的实例;否则,返回已存在的实例。 - * @date: 2024-12-21 22:30 - * @author: 齐景熙 - */ + * 获取单例对象。 + * @param context 应用上下文 + * @return 单例对象 + */ static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); @@ -373,31 +330,22 @@ db:可写的数据库对象,用于执行插入操作。 */ return mInstance; } - /** - * @method onCreate - * @description 数据库创建时的回调方法。调用 createNoteTable 和 createDataTable 方法创建笔记表和数据表。 - * @date: 2024-12-21 22:40 - * @author: 齐景熙 - */ + * 创建数据库时调用。 + * @param db 数据库对象 + */ @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } - /** - * @method onUpgrade - * @description 数据库版本升级时的回调方法。根据旧版本号和新版本号,依次调用相应的升级方法 - (如 upgradeToV2、upgradeToV3 等),并在需要时重新创建触发器。如果旧版本号和新版本号不匹配,则抛出异常。 - * @date: 2024-12-21 22:47 - * @author: 齐景熙 - */ - /*参数: -db:可写的数据库对象,用于执行升级操作。 -oldVersion:旧的数据库版本号。 -newVersion:新的数据库版本号。 */ + * 数据库版本升级时调用。 + * @param db 数据库对象 + * @param oldVersion 旧版本号 + * @param newVersion 新版本号 + */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; @@ -432,17 +380,14 @@ newVersion:新的数据库版本号。 */ if (oldVersion != newVersion) { throw new IllegalStateException("Upgrade notes database to version " + newVersion - + "fails"); + + " fails"); } } - /** - * @method upgradeToV2 - * @description 升级数据库到版本 2。删除旧的笔记表和数据表,然后重新创建笔记表和数据表。 - * @date: 2024-12-21 22:51 - * @author: 齐景熙 - */ + * 升级到版本2。 + * @param db 数据库对象 + */ private void upgradeToV2(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); @@ -450,49 +395,68 @@ newVersion:新的数据库版本号。 */ createDataTable(db); } - /** - * @method upgradeToV3 - * @description 升级数据库到版本 3。删除不再使用的触发器,为笔记表添加 gtask_id 列,并创建回收站系统文件夹。 - * @date: 2024-12-21 22:55 - * @author: 齐景熙 - */ + * 升级到版本3。 + * @param 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.ID, Notes.ID_TRASH_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); } - /** - * @method upgradeToV4 - * @description 升级数据库到版本 4。为笔记表添加 version 列。 - * @date: 2024-12-21 22:57 - * @author: 齐景熙 - */ + * 升级到版本4。 + * @param db 数据库对象 + */ private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); } - /** - * @method upgradeToV5 - * @description 升级数据库到版本 5。为笔记表添加 top 列。 - * @date: 2024-12-21 23:00 - * @author: 齐景熙 - */ + * 升级到版本5。 + * @param db 数据库对象 + */ private void upgradeToV5(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TOP + " INTEGER NOT NULL DEFAULT 0"); } } + +/** + * 类注释 +NotesDatabaseHelper 类用于管理便签应用的数据库。它继承自 SQLiteOpenHelper,提供了数据库的创建、升级和版本管理功能。 +常量定义 +DB_NAME:数据库文件名。 +DB_VERSION:数据库版本。 +TABLE:定义数据库表名的接口。 +TAG:日志标签。 +SQL 语句定义 +CREATE_NOTE_TABLE_SQL:创建便签表的 SQL 语句。 +CREATE_DATA_TABLE_SQL:创建数据表的 SQL 语句。 +CREATE_DATA_NOTE_ID_INDEX_SQL:创建数据表的索引 SQL 语句。 +NOTE_*_TRIGGER:便签表的触发器 SQL 语句。 +DATA_*_TRIGGER:数据表的触发器 SQL 语句。 +构造函数 +NotesDatabaseHelper:构造函数,初始化数据库名称和版本。 +创建表和触发器的方法 +createNoteTable:创建便签表。 +reCreateNoteTableTriggers:重新创建便签表的触发器。 +createSystemFolder:创建系统文件夹。 +createDataTable:创建数据表。 +reCreateDataTableTriggers:重新创建数据表的触发器。 +单例方法 +getInstance:获取单例对象。 +数据库创建和升级方法 +onCreate:创建数据库时调用。 +onUpgrade:数据库版本升级时调用。 +upgradeToV2、upgradeToV3、upgradeToV4、upgradeToV5:具体的版本升级方法。 + */ \ No newline at end of file diff --git a/src/java/net/micode/notes/data/NotesProvider.java b/src/java/net/micode/notes/data/NotesProvider.java index 17488ef..bf21549 100644 --- a/src/java/net/micode/notes/data/NotesProvider.java +++ b/src/java/net/micode/notes/data/NotesProvider.java @@ -14,24 +14,6 @@ * limitations under the License. */ - - /** - * - * @ProjectName: minode - * @Package: net.micode.notes.data - * @ClassName: NotesProvider - * @Description: 该类继承自 ContentProvider,用于实现笔记数据的访问和管理。它定义了 URI 匹配器、数据库帮助者 - 等成员变量,并重写了 ContentProvider 的主要方法,如 onCreate、query、insert、delete、update 等, - 实现了对笔记和数据表的查询、插入、删除和更新操作。通过该类,其他组件可以方便地访问和操作笔记数据。 - * @Author: 齐景熙 - * @Date: 2024-12-21 23:10 - */ - - /*主要成员变量和常量: -mMatcher:URI 匹配器,用于匹配不同的 URI。 -mHelper:数据库帮助者对象,用于访问数据库。 -TAG:用于日志记录的标签。 -URI_NOTE、URI_NOTE_ITEM 等:定义了不同 URI 的匹配码。 */ package net.micode.notes.data; @@ -51,13 +33,22 @@ 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; +package net.micode.notes.data; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.provider.SearchManager; +import android.text.TextUtils; +import android.util.Log; /** - * @method NotesProvider - * @description 默认构造函数,无特殊功能。 - * @date: 2024-12-21 23:12 - * @author: 齐景熙 - */ + * NotesProvider 类是一个 ContentProvider,用于管理便签应用的数据。 + * 它提供了对便签和数据表的查询、插入、删除和更新操作。 + */ public class NotesProvider extends ContentProvider { private static final UriMatcher mMatcher; @@ -65,14 +56,12 @@ public class NotesProvider extends ContentProvider { 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; + private static final int URI_NOTE = 1; // 便签表的 URI + private static final int URI_NOTE_ITEM = 2; // 便签表中单个便签的 URI + private static final int URI_DATA = 3; // 数据表的 URI + private static final int URI_DATA_ITEM = 4; // 数据表中单个数据的 URI + private static final int URI_SEARCH = 5; // 搜索 URI + private static final int URI_SEARCH_SUGGEST = 6; // 搜索建议 URI static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -85,55 +74,26 @@ public class NotesProvider extends ContentProvider { 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 + "," - + 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 + "," - + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," - + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," - + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + + 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 + "," + + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," + + "'" + 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; - + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLDER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - -/** - * @method onCreate - * @description ContentProvider 创建时的回调方法。获取上下文,调用 NotesDatabaseHelper.getInstance - 方法创建数据库帮助者对象 mHelper,并返回 true 表示创建成功。 - * @date: 2024-12-21 23:13 - * @author: 齐景熙 - */ @Override public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } -/** - * @method query - * @description 查询数据。根据匹配的 URI,执行不同的查询操作: - URI_NOTE:查询笔记表。 - URI_NOTE_ITEM:查询特定 ID 的笔记。 - URI_DATA:查询数据表。 - URI_DATA_ITEM:查询特定 ID 的数据。 - URI_SEARCH、URI_SEARCH_SUGGEST:执行搜索查询,根据搜索字符串查询笔记的摘要。 - * @date: 2024-12-21 23:15 - * @author: 齐景熙 - */ -/*uri:要查询的 URI。 -projection:要查询的列。 -selection:查询条件。 -selectionArgs:查询条件参数。 -sortOrder:排序顺序。 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { @@ -195,18 +155,7 @@ sortOrder:排序顺序。 */ } return c; } -/** - * @method insert - * @description 插入数据。根据匹配的 URI,执行不同的插入操作: - URI_NOTE:向笔记表插入笔记。 - URI_DATA:向数据表插入数据。 - 插入成功后,通知相关的 URI 发生变化。 - * @date: 2024-12-21 23:17 - * @author: 齐景熙 - */ -/* 参数: -uri:要插入的 URI。 -values:要插入的数据。*/ + @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = mHelper.getWritableDatabase(); @@ -241,23 +190,6 @@ values:要插入的数据。*/ return ContentUris.withAppendedId(uri, insertedId); } -/** - * @method delete - * @description 删除数据。根据匹配的 URI,执行不同的删除操作: - URI_NOTE:删除笔记表中的笔记。 - URI_NOTE_ITEM:删除特定 ID 的笔记。 - URI_DATA:删除数据表中的数据。 - URI_DATA_ITEM:删除特定 ID 的数据。 - 删除成功后,通知相关的 URI 发生变化。 - * @date: 2024-12-21 23:20 - * @author: 齐景熙 - */ - -/*参数: -uri:要删除的 URI。 -selection:删除条件。 -selectionArgs:删除条件参数。 - */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; @@ -303,22 +235,7 @@ selectionArgs:删除条件参数。 } return count; } -/** - * @method update - * @description 更新数据。根据匹配的 URI,执行不同的更新操作: - URI_NOTE:更新笔记表中的笔记。 - URI_NOTE_ITEM:更新特定 ID 的笔记。 - URI_DATA:更新数据表中的数据。 - URI_DATA_ITEM:更新特定 ID 的数据。 - 更新成功后,通知相关的 URI 发生变化。 - * @date: 2024-12-21 23:22 - * @author: 齐景熙 - */ -/*参数: -uri:要更新的 URI。 -values:更新的数据。 -selection:更新条件。 -selectionArgs:更新条件参数。 */ + @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; @@ -358,30 +275,11 @@ selectionArgs:更新条件参数。 */ } return count; } -/** - * @method parseSelection - * @description 解析查询条件。如果查询条件不为空,则返回包含查询条件的字符串;否则返回空字符串。 - * @date: 2024-12-21 23:25 - * @author: 齐景熙 - */ -/*参数: -selection:查询条件。 */ private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } - - /** - * @method increaseNoteVersion - * @description 增加笔记版本号。根据笔记 ID 或查询条件,更新笔记表中相应笔记的版本号。 - * @date: 2024-12-21 23:27 - * @author: 齐景熙 - */ - /*参数: -id:笔记 ID。 -selection:更新条件。 -selectionArgs:更新条件参数。 */ private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -407,17 +305,44 @@ selectionArgs:更新条件参数。 */ mHelper.getWritableDatabase().execSQL(sql.toString()); } - - /** - * @method getType - * @description 获取 MIME 类型。该方法未实现,返回 null - * @date: 2024-12-21 23:30 - * @author: 齐景熙 - */ @Override public String getType(Uri uri) { - // TODO Auto-generated method stub return null; } - } + +/** + * 类注释 +NotesProvider 类是一个 ContentProvider,用于管理便签应用的数据。它提供了对便签和数据表的查询、插入、删除和更新操作。 +常量定义 +mMatcher:用于匹配 URI 的 UriMatcher 对象。 +mHelper:数据库帮助类 NotesDatabaseHelper 的实例。 +TAG:日志标签。 +URI_*:不同的 URI 类型常量。 +NOTES_SEARCH_PROJECTION:搜索建议的投影字符串。 +NOTES_SNIPPET_SEARCH_QUERY:搜索便签摘要的 SQL 查询语句。 +静态初始化块 +初始化 UriMatcher,添加不同的 URI 匹配规则。 +onCreate 方法 +初始化 NotesDatabaseHelper 实例。 +query 方法 +处理不同的 URI 类型,执行查询操作并返回游标。 +支持便签表、便签项、数据表、数据项、搜索和搜索建议的查询。 +insert 方法 +处理不同的 URI 类型,执行插入操作并返回新插入的 URI。 +支持便签表和数据表的插入操作。 +通知相关 URI 的变化。 +delete 方法 +处理不同的 URI 类型,执行删除操作并返回删除的行数。 +支持便签表、便签项、数据表和数据项的删除操作。 +通知相关 URI 的变化。 +update 方法 +处理不同的 URI 类型,执行更新操作并返回更新的行数。 +支持便签表、便签项、数据表和数据项的更新操作。 +通知相关 URI 的变化。 +辅助方法 +parseSelection:解析选择条件字符串。 +increaseNoteVersion:增加便签的版本号。 +getType 方法 +返回 URI 的 MIME 类型(当前未实现)。 + */ \ No newline at end of file