From e485a39d78d088cc801a68906935cec32c3ff315 Mon Sep 17 00:00:00 2001 From: sue <1405477765@qq.com> Date: Thu, 29 May 2025 14:26:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A42?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/net/micode/notes/ui/NoteItemData.java | 111 +++++++++++++--------- 1 file changed, 68 insertions(+), 43 deletions(-) diff --git a/src/net/micode/notes/ui/NoteItemData.java b/src/net/micode/notes/ui/NoteItemData.java index 0f5a878..f69ec7e 100644 --- a/src/net/micode/notes/ui/NoteItemData.java +++ b/src/net/micode/notes/ui/NoteItemData.java @@ -24,24 +24,28 @@ import net.micode.notes.data.Contact; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.DataUtils; - +/** + * 便签条目数据模型类 + * 用于封装便签数据库记录的字段信息,并提供数据解析和状态判断功能 + */ public class NoteItemData { + // 数据库查询投影(指定需要查询的字段) static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, - NoteColumns.HAS_ATTACHMENT, - NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, - NoteColumns.PARENT_ID, - NoteColumns.SNIPPET, - NoteColumns.TYPE, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, + NoteColumns.ID, // 便签ID + NoteColumns.ALERTED_DATE, // 提醒日期 + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.CREATED_DATE, // 创建日期 + NoteColumns.HAS_ATTACHMENT, // 是否有附件(0/1) + NoteColumns.MODIFIED_DATE, // 修改日期 + NoteColumns.NOTES_COUNT, // 子便签数量(用于文件夹类型) + NoteColumns.PARENT_ID, // 父级ID(文件夹ID或系统类型标识) + NoteColumns.SNIPPET, // 便签摘要 + NoteColumns.TYPE, // 便签类型(普通便签、文件夹等) + NoteColumns.WIDGET_ID, // 小部件ID + NoteColumns.WIDGET_TYPE, // 小部件类型 }; - +// 投影字段索引常量(提高代码可读性) private static final int ID_COLUMN = 0; private static final int ALERTED_DATE_COLUMN = 1; private static final int BG_COLOR_ID_COLUMN = 2; @@ -54,71 +58,88 @@ public class NoteItemData { private static final int TYPE_COLUMN = 9; private static final int WIDGET_ID_COLUMN = 10; private static final int WIDGET_TYPE_COLUMN = 11; - - private long mId; - private long mAlertDate; - private int mBgColorId; - private long mCreatedDate; - private boolean mHasAttachment; - private long mModifiedDate; - private int mNotesCount; - private long mParentId; - private String mSnippet; - private int mType; - private int mWidgetId; - private int mWidgetType; - private String mName; - private String mPhoneNumber; - - private boolean mIsLastItem; - private boolean mIsFirstItem; - private boolean mIsOnlyOneItem; - private boolean mIsOneNoteFollowingFolder; - private boolean mIsMultiNotesFollowingFolder; - +// 便签基础属性 + private long mId; // 便签ID + private long mAlertDate; // 提醒时间戳 + private int mBgColorId; // 背景颜色资源ID + private long mCreatedDate; // 创建时间戳 + private boolean mHasAttachment; // 是否包含附件 + private long mModifiedDate; // 修改时间戳 + private int mNotesCount; // 子便签数量(文件夹类型专用) + private long mParentId; // 父级ID(所属文件夹或系统类型标识) + private String mSnippet; // 便签内容摘要 + private int mType; // 便签类型(参考Notes.TYPE_*常量) + private int mWidgetId; // 关联的小部件ID + private int mWidgetType; // 小部件类型(如尺寸规格) + // 通话记录相关属性(当父级为通话记录文件夹时) + private String mName; // 联系人姓名 + private String mPhoneNumber; // 电话号码 +// 条目位置状态属性 + private boolean mIsLastItem;// 是否为数据集最后一条 + private boolean mIsFirstItem;// 是否为数据集第一条 + private boolean mIsOnlyOneItem;// 是否为数据集中唯一一条 + private boolean mIsOneNoteFollowingFolder;// 是否为文件夹后的单条便签 + private boolean mIsMultiNotesFollowingFolder;// 是否为文件夹后的多条便签 + /** + * 构造函数:从数据库Cursor中解析便签数据 + * @param context 应用上下文 + * @param cursor 包含便签数据的数据库游标 + */ public NoteItemData(Context context, Cursor cursor) { + // 读取基础字段 mId = cursor.getLong(ID_COLUMN); mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); - mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false;// 0转false,非0转true mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); mParentId = cursor.getLong(PARENT_ID_COLUMN); mSnippet = cursor.getString(SNIPPET_COLUMN); + // 移除便签内容中的特殊标记(可能用于富文本格式) mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( NoteEditActivity.TAG_UNCHECKED, ""); mType = cursor.getInt(TYPE_COLUMN); mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); + // 处理通话记录特殊逻辑(父级为通话记录文件夹时) mPhoneNumber = ""; if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { + // 通过便签ID获取通话号码 mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); if (!TextUtils.isEmpty(mPhoneNumber)) { + // 根据电话号码查询联系人姓名 mName = Contact.getContact(context, mPhoneNumber); + // 若未找到联系人,使用电话号码作为名称 if (mName == null) { mName = mPhoneNumber; } } } - +// 确保名称非空 if (mName == null) { mName = ""; } + // 检查条目在数据集中的位置状态 checkPostion(cursor); } - + /** + * 私有方法:分析条目在数据集中的位置状态 + * @param cursor 数据库游标(需保持当前位置) + */ private void checkPostion(Cursor cursor) { + // 基本位置状态 mIsLastItem = cursor.isLast() ? true : false; mIsFirstItem = cursor.isFirst() ? true : false; mIsOnlyOneItem = (cursor.getCount() == 1); mIsMultiNotesFollowingFolder = false; mIsOneNoteFollowingFolder = false; - +// 处理普通便签跟随在文件夹后的情况 if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { - int position = cursor.getPosition(); + int position = cursor.getPosition();// 记录当前位置 if (cursor.moveToPrevious()) { + // 移动到前一条目 if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { if (cursor.getCount() > (position + 1)) { @@ -133,7 +154,7 @@ public class NoteItemData { } } } - +// -------------------- 状态查询方法 -------------------- public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; } @@ -217,7 +238,11 @@ public class NoteItemData { public boolean isCallRecord() { return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); } - + /** + * 静态方法:从Cursor中获取便签类型 + * @param cursor 数据库游标(需指向有效记录) + * @return 便签类型(Notes.TYPE_*常量) + */ public static int getNoteType(Cursor cursor) { return cursor.getInt(TYPE_COLUMN); }