/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.micode.notes.gtask.data; import android.appwidget.AppWidgetManager; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.util.Log; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.exception.ActionFailureException; import net.micode.notes.tool.GTaskStringUtils; import net.micode.notes.tool.ResourceParser; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; // SqlNote类用于处理与笔记相关的数据操作,包括从数据库加载笔记数据、 // 将笔记数据转换为JSON格式、设置笔记内容以及将修改提交到数据库等功能。 public class SqlNote { // 用于在日志输出中标识该类的标签,取类的简单名称,方便在日志里区分该类相关的记录 private static final String TAG = SqlNote.class.getSimpleName(); // 定义一个表示无效的ID值,常用于初始化笔记ID属性或者在后续判断ID是否合法等场景 private static final int INVALID_ID = -99999; // 定义一个字符串数组,指定从数据库查询笔记相关信息时需要获取的列名,与笔记在数据库中的各个字段对应 public static final String[] PROJECTION_NOTE = 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.SYNC_ID, NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, NoteColumns.VERSION }; // 定义常量,表示在查询结果游标中对应NoteColumns.ID列的索引位置(从0开始计数),便于从游标准确获取对应列数据 public static final int ID_COLUMN = 0; public static final int ALERTED_DATE_COLUMN = 1; public static final int BG_COLOR_ID_COLUMN = 2; public static final int CREATED_DATE_COLUMN = 3; public static final int HAS_ATTACHMENT_COLUMN = 4; public static final int MODIFIED_DATE_COLUMN = 5; public static final int NOTES_COUNT_COLUMN = 6; public static final int PARENT_ID_COLUMN = 7; public static final int SNIPPET_COLUMN = 8; public static final int TYPE_COLUMN = 9; public static final int WIDGET_ID_COLUMN = 10; public static final int WIDGET_TYPE_COLUMN = 11; public static final int SYNC_ID_COLUMN = 12; public static final int LOCAL_MODIFIED_COLUMN = 13; public static final int ORIGIN_PARENT_ID_COLUMN = 14; public static final int GTASK_ID_COLUMN = 15; public static final int VERSION_COLUMN = 16; // 上下文对象,用于获取系统服务等资源,是与Android系统交互的重要入口 private Context mContext; // 用于与内容提供器交互,实现对数据库中笔记相关数据的查询、插入、更新、删除等操作 private ContentResolver mContentResolver; // 标记当前操作是否为创建新笔记,初始化为true,后续根据实际情况改变 private boolean mIsCreate; // 存储笔记的唯一标识符(ID),初始化为无效ID(INVALID_ID),后续会更新为实际数据库中的ID值 private long mId; // 存储笔记的提醒日期(以时间戳形式表示),初始化为0,具体业务逻辑中根据该值处理提醒相关功能 private long mAlertDate; // 存储笔记的背景颜色ID,初始值通过ResourceParser工具类获取默认背景色ID,可按需更新 private int mBgColorId; // 存储笔记的创建日期(时间戳),初始化为当前系统时间,用于记录笔记创建时间点 private long mCreatedDate; // 存储笔记是否有附件的标识,0可能表示无附件(依业务逻辑而定),初始化为0,可修改 private int mHasAttachment; // 存储笔记的最后修改日期(时间戳),初始化为当前系统时间,每次修改笔记时应更新该值 private long mModifiedDate; // 存储笔记的父级ID,用于构建笔记的层级结构(如文件夹与子笔记关联等),初始化为0 private long mParentId; // 存储笔记的摘要或简短描述信息,初始化为空字符串,可更新为实际摘要内容 private String mSnippet; // 存储笔记的类型,初始化为Notes.TYPE_NOTE,不同类型有不同处理逻辑和展示方式(由Notes类定义) private int mType; // 存储笔记关联的小部件ID,初始化为无效小部件ID(AppWidgetManager.INVALID_APPWIDGET_ID),表示未关联有效小部件,可更新 private int mWidgetId; // 存储笔记关联的小部件类型,初始化为Notes.TYPE_WIDGET_INVALIDE,可根据实际情况修改 private int mWidgetType; // 存储笔记的原始父级ID,可能在特定业务场景下使用(区别于当前的mParentId),初始化为0 private long mOriginParent; // 存储笔记的版本号,初始化为0,可根据业务规则在笔记更新等操作时递增,用于版本控制逻辑 private long mVersion; // 用于暂存要更新的笔记相关数据值,以ContentValues形式存在,便于批量更新数据库操作 private ContentValues mDiffNoteValues; // 用于存储与该笔记相关的数据列表,每个元素是SqlData类型(对应笔记包含的具体数据内容等),初始化为空列表 private ArrayList mDataList; // 构造函数,用于创建一个新的SqlNote对象,通常用于新建笔记的场景,会初始化一系列成员变量的默认值 public SqlNote(Context context) { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = true; mId = INVALID_ID; mAlertDate = 0; mBgColorId = ResourceParser.getDefaultBgId(context); mCreatedDate = System.currentTimeMillis(); mHasAttachment = 0; mModifiedDate = System.currentTimeMillis(); mParentId = 0; mSnippet = ""; mType = Notes.TYPE_NOTE; mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; mWidgetType = Notes.TYPE_WIDGET_INVALIDE; mOriginParent = 0; mVersion = 0; mDiffNoteValues = new ContentValues(); mDataList = new ArrayList(); } // 构造函数,根据传入的Context和Cursor对象,从数据库游标中加载笔记数据来初始化对象,常用于从数据库查询已有笔记的情况 public SqlNote(Context context, Cursor c) { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; loadFromCursor(c); mDataList = new ArrayList(); if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); } // 构造函数,根据传入的Context和笔记ID,从数据库中查询对应ID的笔记数据来初始化对象,常用于已知笔记ID获取笔记详情的情况 public SqlNote(Context context, long id) { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; loadFromCursor(id); mDataList = new ArrayList(); if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); } // 私有方法,根据传入的笔记ID从数据库中查询对应的笔记数据,通过游标递归加载数据到对象属性,若游标为空则记录警告日志 private void loadFromCursor(long id) { Cursor c = null; try { // 使用ContentResolver根据指定的Uri、查询投影、查询条件等查询笔记数据 c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", new String[] { String.valueOf(id) }, null); if (c!= null) { c.moveToNext(); loadFromCursor(c); } else { Log.w(TAG, "loadFromCursor: cursor = null"); } } finally { if (c!= null) c.close(); } } // 私有方法,从给定的游标中读取数据并赋值给相应的成员变量,按照之前定义的列索引位置来获取对应的数据 private void loadFromCursor(Cursor c) { mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); mCreatedDate = c.getLong(CREATED_DATE_COLUMN); mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); mParentId = c.getLong(PARENT_ID_COLUMN); mSnippet = c.getString(SNIPPET_COLUMN); mType = c.getInt(TYPE_COLUMN); mWidgetId = c.getInt(WIDGET_ID_COLUMN); mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); mVersion = c.getLong(VERSION_COLUMN); } // 私有方法,用于加载与该笔记相关的数据内容,通过查询数据库获取对应的数据,并构建SqlData对象添加到mDataList中,若游标为空或查询结果数量为0会记录相应日志 private void loadDataContent() { Cursor c = null; mDataList.clear(); try { // 使用ContentResolver根据指定的Uri、查询投影、查询条件等查询与笔记相关的数据内容 c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, "(note_id=?)", new String[] { String.valueOf(mId) }, null); if (c!= null) { if (c.getCount() == 0) { Log.w(TAG, "it seems that the note has not data"); return; } while (c.moveToNext()) { // 为每条查询到的数据创建一个SqlData对象,并添加到mDataList列表中 SqlData data = new SqlData(mContext, c); mDataList.add(data); } } else { Log.w(TAG, "loadDataContent: cursor = null"); } } finally { if (c!= null) c.close(); } } // 方法用于根据传入的JSONObject设置笔记的内容,根据笔记类型(系统、文件夹、普通笔记)分别处理不同的属性设置逻辑,若JSON解析出错则返回false public boolean setContent(JSONObject js) { try { // 从传入的JSON对象中获取表示笔记主体信息的JSONObject JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { Log.w(TAG, "cannot set system folder"); } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { // 对于文件夹类型的笔记,只能更新摘要和类型属性 String snippet = note.has(NoteColumns.SNIPPET)? note.getString(NoteColumns.SNIPPET) : ""; if (mIsCreate ||!mSnippet.equals(snippet)) { mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); } mSnippet = snippet; int type = note.has(NoteColumns.TYPE)? note.getInt(NoteColumns.TYPE) : Notes.TYPE_NOTE; if (mIsCreate || mType!= type) { mDiffNoteValues.put(NoteColumns.TYPE, type); } mType = type; } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { // 对于普通笔记类型,处理更多的属性设置逻辑 JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); long id = note.has(NoteColumns.ID)? note.getLong(NoteColumns.ID) : INVALID_ID; if (mIsCreate || mId!= id) { mDiffNoteValues.put(NoteColumns.ID, id); } mId = id; long alertDate = note.has(NoteColumns.ALERTED_DATE)? note.getLong(NoteColumns.ALERTED_DATE) : 0; if (mIsCreate || mAlertDate!= alertDate) { mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); } mAlertDate = alertDate; int bgColorId = note.has(NoteColumns.BG_COLOR_ID)? note.getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); if (mIsCreate || mBgColorId!= bgColorId) { mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); } mBgColorId = bgColorId; long createDate = note.has(NoteColumns.CREATED_DATE)? note.getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); if (mIsCreate || mCreatedDate!= createDate) { mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); } mCreatedDate = createDate; int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT)? note.getInt(NoteColumns.HAS_ATTACHMENT) : 0; if (mIsCreate || mHasAttachment!= hasAttachment) { mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); } mHasAttachment = hasAttachment; long modifiedDate = note.has(NoteColumns.MODIFIED_DATE)? note.getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); if (mIsCreate || mModifiedDate!= modifiedDate) { mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); } mModifiedDate = modifiedDate; long parentId = note.has(NoteColumns.PARENT_ID)? note.getLong(NoteColumns.PARENT_ID) : 0; if (mIsCreate || mParentId!= parentId) { mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); } mParentId = parentId; String snippet = note.has(NoteColumns.SNIPPET)? note.getString(NoteColumns.SNIPPET) : ""; if (mIsCreate ||!mSnippet.equals(snippet)) { mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); } mSnippet = snippet; int type = note.has(NoteColumns.TYPE)? note.getInt(NoteColumns.TYPE) : Notes.TYPE_NOTE; if (mIsCreate || mType!= type) { mDiffNoteValues.put(NoteColumns.TYPE, type); } mType = type; int widgetId = note.has(NoteColumns.WIDGET_ID)? note.getInt(NoteColumns.WIDGET_ID) : AppWidgetManager.INVALID_APPWIDGET_ID; if (mIsCreate || mWidgetId!= widgetId) { mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); } mWidgetId = widgetId; int widgetType = note.has(NoteColumns.WIDGET_TYPE)? note.getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; if (mIsCreate || mWidgetType!= widgetType) { mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); } mWidgetType = widgetType; long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID)? note.getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; if (mIsCreate || mOriginParent!= originParent) { mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); } mOriginParent = originParent; // 处理笔记相关的数据内容,遍历JSON数组中的每个数据对象进行相应操作 for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); SqlData sqlData = null; if (data.has(DataColumns.ID)) { long dataId = data.getLong(DataColumns.ID); for (SqlData temp : mDataList) { if (dataId == temp.getId()) { sqlData = temp; } } } if (sqlData == null) { sqlData = new SqlData(mContext); mDataList.add(sqlData); } sqlData.setContent(data); } } } catch (JSONException e) { Log.e(TAG, e.toString()); e.printStackTrace(); return false; } return true; } // 获取笔记相关内容并转换为JSONObject格式返回的方法 // 如果笔记尚未创建(mIsCreate为true),则记录错误日志并返回null,否则根据笔记类型构建相应的JSON对象结构 public JSONObject getContent() { try { JSONObject js = new JSONObject(); // 如果是创建状态(尚未真正在数据库中创建该笔记),则输出错误日志并返回null,因为此时还没有完整的笔记数据可供获取 if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } JSONObject note = new JSONObject(); // 如果笔记类型是普通笔记(Notes.TYPE_NOTE) if (mType == Notes.TYPE_NOTE) { // 将笔记的各个属性添加到名为note的JSONObject中,这些属性包括ID、提醒日期、背景颜色ID等等 note.put(NoteColumns.ID, mId); note.put(NoteColumns.ALERTED_DATE, mAlertDate); note.put(NoteColumns.BG_COLOR_ID, mBgColorId); note.put(NoteColumns.CREATED_DATE, mCreatedDate); note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); note.put(NoteColumns.PARENT_ID, mParentId); note.put(NoteColumns.SNIPPET, mSnippet); note.put(NoteColumns.TYPE, mType); note.put(NoteColumns.WIDGET_ID, mWidgetId); note.put(NoteColumns.WIDGET_TYPE, mWidgetType); note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); // 将包含笔记主体信息的note对象添加到外层的js对象中,对应键为GTaskStringUtils.META_HEAD_NOTE,通常用于标识这是笔记的主要信息部分 js.put(GTaskStringUtils.META_HEAD_NOTE, note); // 创建一个JSONArray用于存放笔记相关的数据内容(对应SqlData类型的数据列表) JSONArray dataArray = new JSONArray(); // 遍历mDataList列表,获取每个SqlData对象对应的JSON内容,并添加到dataArray中(如果不为null) for (SqlData sqlData : mDataList) { JSONObject data = sqlData.getContent(); if (data!= null) { dataArray.put(data); } } // 将包含笔记数据内容的dataArray添加到外层的js对象中,对应键为GTaskStringUtils.META_HEAD_DATA,用于标识这是笔记附属的数据部分 js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { // 如果笔记类型是文件夹(Notes.TYPE_FOLDER)或者系统类型(Notes.TYPE_SYSTEM),只添加ID、类型和摘要信息到note对象中 note.put(NoteColumns.ID, mId); note.put(NoteColumns.TYPE, mType); note.put(NoteColumns.SNIPPET, mSnippet); // 将包含基本信息的note对象添加到外层的js对象中 js.put(GTaskStringUtils.META_HEAD_NOTE, note); } // 返回构建好的包含笔记所有相关信息(根据类型不同有不同结构)的js对象 return js; } catch (JSONException e) { // 如果在构建JSON对象过程中出现异常,记录错误日志并打印异常堆栈信息 Log.e(TAG, e.toString()); e.printStackTrace(); } return null; } // 设置笔记的父级ID的方法,同时将该ID更新到mDiffNoteValues中,用于后续批量更新数据库操作 public void setParentId(long id) { mParentId = id; mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } // 设置笔记的GtaskId的方法,将传入的gid添加到mDiffNoteValues中,方便后续数据库更新时使用该值更新对应字段 public void setGtaskId(String gid) { mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } // 设置笔记的同步ID的方法,将传入的syncId添加到mDiffNoteValues中,用于在同步相关操作时更新对应数据库字段 public void setSyncId(long syncId) { mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); } // 将笔记的本地修改标记重置为0的方法,通过更新mDiffNoteValues中对应字段的值来实现,可能用于表示本地修改状态的重置 public void resetLocalModified() { mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); } // 获取笔记的唯一标识符(ID)的方法,直接返回成员变量mId的值 public long getId() { return mId; } // 获取笔记的父级ID的方法,直接返回成员变量mParentId的值 public long getParentId() { return mParentId; } // 获取笔记摘要信息的方法,直接返回成员变量mSnippet的值 public String getSnippet() { return mSnippet; } // 判断笔记是否为普通笔记类型(Notes.TYPE_NOTE)的方法,返回布尔值结果 public boolean isNoteType() { return mType == Notes.TYPE_NOTE; } // 将笔记相关的修改提交到数据库的方法,根据是创建还是更新操作有不同的处理逻辑,同时会处理关联的数据提交以及更新本地缓存信息等操作 public void commit(boolean validateVersion) { if (mIsCreate) { // 如果是创建操作且当前的mDiffNoteValues中包含了ID字段(通常不应该在创建时手动指定ID,由数据库自动生成),则移除该字段 if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { mDiffNoteValues.remove(NoteColumns.ID); } // 使用ContentResolver插入新笔记数据到数据库,根据指定的Notes.CONTENT_NOTE_URI以及待插入的数据mDiffNoteValues进行插入操作 Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); try { // 尝试从插入操作返回的Uri中获取新生成的笔记ID,如果解析失败则抛出异常 mId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { Log.e(TAG, "Get note id error :" + e.toString()); throw new ActionFailureException("create note failed"); } // 如果获取到的笔记ID为0,表示创建失败,抛出异常 if (mId == 0) { throw new IllegalStateException("Create thread id failed"); } // 如果笔记类型是普通笔记(Notes.TYPE_NOTE),遍历mDataList列表,调用每个SqlData对象的commit方法来提交相关附属数据(传入相应参数) if (mType == Notes.TYPE_NOTE) { for (SqlData sqlData : mDataList) { sqlData.commit(mId, false, -1); } } } else { // 如果不是创建操作(即更新操作),先判断笔记ID是否合法(小于等于0且不是特定的合法文件夹ID时认为不合法),不合法则抛出异常 if (mId <= 0 && mId!= Notes.ID_ROOT_FOLDER && mId!= Notes.ID_CALL_RECORD_FOLDER) { Log.e(TAG, "No such note"); throw new IllegalStateException("Try to update note with invalid id"); } // 如果有需要更新的数据(mDiffNoteValues大小大于0) if (mDiffNoteValues.size() > 0) { // 版本号自增,用于标记笔记数据的更新情况,可能用于后续的版本控制逻辑,比如同步等场景判断数据新旧 mVersion ++; int result = 0; // 如果不需要验证版本(validateVersion为false),直接根据笔记ID更新对应笔记数据到数据库 if (!validateVersion) { result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + NoteColumns.ID + "=?)", new String[] { String.valueOf(mId) }); } else { // 如果需要验证版本,更新时除了根据笔记ID,还要判断版本号是否小于等于当前版本,符合条件才进行更新 result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", new String[] { String.valueOf(mId), String.valueOf(mVersion) }); } // 如果更新操作影响的行数为0(即没有实际更新数据),记录警告日志,可能是用户在同步期间已经更新了笔记导致本次更新无效 if (result == 0) { Log.w(TAG, "there is no update. maybe user updates note when syncing"); } } // 如果笔记类型是普通笔记(Notes.TYPE_NOTE),遍历mDataList列表,调用每个SqlData对象的commit方法来提交相关附属数据(传入相应参数,包括是否验证版本和当前版本号) if (mType == Notes.TYPE_NOTE) { for (SqlData sqlData : mDataList) { sqlData.commit(mId, validateVersion, mVersion); } } } // 刷新本地信息,重新从数据库加载笔记数据(根据笔记ID),如果是普通笔记类型还会加载相关的数据内容(通过调用对应方法) loadFromCursor(mId); if (mType == Notes.TYPE_NOTE) loadDataContent(); // 清空mDiffNoteValues,因为已经完成了数据的更新提交操作,下次再有修改时重新往里面添加需要更新的数据 mDiffNoteValues.clear(); // 将mIsCreate标记设置为false,表示当前笔记已经不是创建状态,而是已经存在于数据库中的可更新状态 mIsCreate = false; }