NoteItemData.java
/**
 * 笔记数据封装类，负责从数据库游标解析笔记属性并处理业务逻辑
 */
public class NoteItemData {
    // 构造方法：从数据库游标初始化笔记数据
    public NoteItemData(Context context, Cursor cursor) {
        // 基础字段初始化
        mId = cursor.getLong(ID_COLUMN);                    // 获取笔记唯一ID
        mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN);   // 提醒时间戳（0表示无提醒）
        mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);     // 背景颜色标识ID
        mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); // 创建时间戳
        mHasAttachment = cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0; // 是否有附件（布尔值转换）
        mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); // 最后修改时间戳
        mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);    // 关联笔记数量（用于文件夹类型）
        mParentId = cursor.getLong(PARENT_ID_COLUMN);       // 父文件夹ID
        mSnippet = cursor.getString(SNIPPET_COLUMN)         // 内容摘要
                .replace(NoteEditActivity.TAG_CHECKED, "")  // 去除完成状态标记符号
                .replace(NoteEditActivity.TAG_UNCHECKED, ""); 
        mType = cursor.getInt(TYPE_COLUMN);                 // 类型（笔记/文件夹/系统项）
        mWidgetId = cursor.getInt(WIDGET_ID_COLUMN);        // 关联小部件ID
        mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN);    // 小部件类型

        // 通话记录特殊处理
        mPhoneNumber = "";  // 初始化电话号码
        if (mParentId == Notes.ID_CALL_RECORD_FOLDER) {     // 判断是否为通话记录类型
            // 通过内容解析器获取通话号码
            mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId);
            if (!TextUtils.isEmpty(mPhoneNumber)) {        // 有效号码处理
                mName = Contact.getContact(context, mPhoneNumber); // 从通讯录获取联系人名称
                mName = (mName != null) ? mName : mPhoneNumber;    // 无联系人时显示号码
            }
        }

        // 名称空值保护
        mName = (mName != null) ? mName : "";  // 确保名称字段不为null
        
        checkPostion(cursor);  // 执行位置状态分析
    }

    // 位置状态分析方法（确定列表项显示样式）
    private void checkPostion(Cursor cursor) {
        mIsLastItem = cursor.isLast();           // 是否列表最后一项
        mIsFirstItem = cursor.isFirst();         // 是否列表首项
        mIsOnlyOneItem = (cursor.getCount() == 1); // 是否唯一项
        mIsMultiNotesFollowingFolder = false;   // 重置多项跟随状态
        mIsOneNoteFollowingFolder = false;      // 重置单项跟随状态

        // 仅普通笔记需要检查文件夹跟随状态
        if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {
            int position = cursor.getPosition();  // 记录当前位置
            if (cursor.moveToPrevious()) {        // 查看前一项数据
                int prevType = cursor.getInt(TYPE_COLUMN);
                // 判断前项是否为文件夹类型
                if (prevType == Notes.TYPE_FOLDER || prevType == Notes.TYPE_SYSTEM) {
                    // 根据剩余项数量判断跟随类型
                    if (cursor.getCount() > (position + 1)) {
                        mIsMultiNotesFollowingFolder = true;  // 多个笔记跟随文件夹
                    } else {
                        mIsOneNoteFollowingFolder = true;     // 单个笔记跟随文件夹
                    }
                }
                // 游标归位安全检查
                if (!cursor.moveToNext()) {
                    throw new IllegalStateException("游标无法返回原位");
                }
            }
        }
    }

    // ====================== 属性访问方法 ======================
    public boolean isOneFollowingFolder() {    // 是否是单个跟随文件夹的笔记
        return mIsOneNoteFollowingFolder;
    }

    public boolean isMultiFollowingFolder() {  // 是否属于多笔记组中的第一个
        return mIsMultiNotesFollowingFolder;
    }

    public boolean isLast() {                  // 是否列表最后一项
        return mIsLastItem;
    }

    public String getCallName() {              // 获取通话记录联系人名称
        return mName;                          // 格式：联系人名 或 电话号码
    }

    public boolean isFirst() {                 // 是否列表首项
        return mIsFirstItem;
    }

    public boolean isSingle() {                // 是否唯一列表项
        return mIsOnlyOneItem;
    }

    public long getId() {                      // 获取数据库主键ID
        return mId;
    }

    // ...（其他标准getter方法略）...

    public boolean hasAlert() {                // 判断是否存在有效提醒
        return mAlertDate > 0;                 // 时间戳大于0表示有提醒
    }

    public boolean isCallRecord() {            // 是否是通话记录类型
        return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber));
    }

    // ====================== 静态工具方法 ======================
    public static int getNoteType(Cursor cursor) {  // 快速获取笔记类型
        return cursor.getInt(TYPE_COLUMN);          // 直接访问类型字段列
    }
}





