You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rass/gtask/data/SqlNote.java

530 lines
27 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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初始化为无效IDINVALID_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初始化为无效小部件IDAppWidgetManager.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<SqlData> 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<SqlData>();
}
// 构造函数根据传入的Context和Cursor对象从数据库游标中加载笔记数据来初始化对象常用于从数据库查询已有笔记的情况
public SqlNote(Context context, Cursor c) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);
mDataList = new ArrayList<SqlData>();
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<SqlData>();
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;
}