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.
xiaomi/src/net/micode/notes/gtask/data/SqlNote.java

534 lines
29 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;
// 包声明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; // 导入 JSON 数组类
import org.json.JSONException; // 导入 JSON 异常类
import org.json.JSONObject; // 导入 JSON 对象类
import java.util.ArrayList; // 导入 ArrayList 类
public class SqlNote {
// SQL 笔记类定义
private static final String TAG = SqlNote.class.getSimpleName(); // 定义静态常量 TAG为当前类名的简写
private static final int INVALID_ID = -99999; // 定义无效 ID 的常量值
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
};
// 定义笔记投影数组,包含各种列名
public static final int ID_COLUMN = 0; // ID 列的索引常量
public static final int ALERTED_DATE_COLUMN = 1; // 提醒日期列的索引常量
public static final int BG_COLOR_ID_COLUMN = 2; // 背景颜色 ID 列的索引常量
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; // 父 ID 列的索引常量
public static final int SNIPPET_COLUMN = 8; // 摘要列的索引常量
public static final int TYPE_COLUMN = 9; // 类型列的索引常量
public static final int WIDGET_ID_COLUMN = 10; // 小部件 ID 列的索引常量
public static final int WIDGET_TYPE_COLUMN = 11; // 小部件类型列的索引常量
public static final int SYNC_ID_COLUMN = 12; // 同步 ID 列的索引常量
public static final int LOCAL_MODIFIED_COLUMN = 13; // 本地修改列的索引常量
public static final int ORIGIN_PARENT_ID_COLUMN = 14; // 原始父 ID 列的索引常量
public static final int GTASK_ID_COLUMN = 15; // GTask ID 列的索引常量
public static final int VERSION_COLUMN = 16; // 版本列的索引常量
private Context mContext; // 定义上下文变量
private ContentResolver mContentResolver; // 定义内容解析器变量
private boolean mIsCreate; // 定义是否为创建状态的变量
private long mId; // 定义 ID 变量
private long mAlertDate; // 定义提醒日期变量
private int mBgColorId; // 定义背景颜色 ID 变量
private long mCreatedDate; // 定义创建日期变量
private int mHasAttachment; // 定义是否有附件变量
private long mModifiedDate; // 定义修改日期变量
private long mParentId; // 定义父 ID 变量
private String mSnippet; // 定义摘要变量
private int mType; // 定义类型变量
private int mWidgetId; // 定义小部件 ID 变量
private int mWidgetType; // 定义小部件类型变量
private long mOriginParent; // 定义原始父 ID 变量
private long mVersion; // 定义版本变量
private ContentValues mDiffNoteValues;
// 定义差异笔记值变量
private ArrayList<SqlData> mDataList;
// 定义 SQL 数据列表变量
public SqlNote(Context context) {
// 无参构造函数,接受上下文参数
mContext = context;
// 将传入的上下文赋值给成员变量
mContentResolver = context.getContentResolver();
// 获取上下文的内容解析器并赋值给成员变量
mIsCreate = true;
// 设置为创建状态
mId = INVALID_ID;
// 设置 ID 为无效值
mAlertDate = 0;
// 设置提醒日期为 0
mBgColorId = ResourceParser.getDefaultBgId(context);
// 设置背景颜色 ID 为资源解析器获取的默认背景颜色 ID
mCreatedDate = System.currentTimeMillis();
// 设置创建日期为当前时间戳
mHasAttachment = 0;
// 设置是否有附件为 0
mModifiedDate = System.currentTimeMillis();
// 设置修改日期为当前时间戳
mParentId = 0;
// 设置父 ID 为 0
mSnippet = "";
// 设置摘要为空字符串
mType = Notes.TYPE_NOTE;
// 设置类型为笔记类型
mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
// 设置小部件 ID 为无效值
mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
// 设置小部件类型为无效值
mOriginParent = 0;
// 设置原始父 ID 为 0
mVersion = 0;
// 设置版本为 0
mDiffNoteValues = new ContentValues();
// 创建新的内容值对象并赋值给差异笔记值变量
mDataList = new ArrayList<SqlData>();
// 创建新的 SQL 数据列表
}
public SqlNote(Context context, Cursor c) {
// 接受上下文和游标参数的构造函数
mContext = context; // 将传入的上下文赋值给成员变量
mContentResolver = context.getContentResolver(); // 获取上下文的内容解析器并赋值给成员变量
mIsCreate = false; // 设置为非创建状态
loadFromCursor(c); // 从游标加载数据
mDataList = new ArrayList<SqlData>(); // 创建新的 SQL 数据列表
if (mType == Notes.TYPE_NOTE)
loadDataContent(); // 如果类型为笔记类型,加载数据内容
mDiffNoteValues = new ContentValues(); // 创建新的内容值对象并赋值给差异笔记值变量
}
public SqlNote(Context context, long id) {
// 接受上下文和 ID 参数的构造函数
mContext = context; // 将传入的上下文赋值给成员变量
mContentResolver = context.getContentResolver(); // 获取上下文的内容解析器并赋值给成员变量
mIsCreate = false; // 设置为非创建状态
loadFromCursor(id);
// 从 ID 加载数据
mDataList = new ArrayList<SqlData>();
// 创建新的 SQL 数据列表
if (mType == Notes.TYPE_NOTE)
loadDataContent();
// 如果类型为笔记类型,加载数据内容
mDiffNoteValues = new ContentValues();
// 创建新的内容值对象并赋值给差异笔记值变量
}
private void loadFromCursor(long id) {
// 从 ID 加载游标数据的私有方法
Cursor c = null;
// 初始化游标为 null
try {
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)",
new String[]{
String.valueOf(id)
}, null);
// 查询内容解析器,获取指定 ID 的笔记数据游标
if (c!= null) {
c.moveToNext();
loadFromCursor(c);
// 如果游标不为 null移动到下一行并从游标加载数据
} else {
Log.w(TAG, "loadFromCursor: cursor = null");
// 如果游标为 null记录日志警告
}
} finally {
if (c!= null)
c.close();
// 最终,如果游标不为 null关闭游标
}
}
private void loadFromCursor(Cursor c) {
// 从游标加载数据的私有方法
mId = c.getLong(ID_COLUMN);
// 获取游标中 ID 列的值并赋值给成员变量
mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
// 获取游标中提醒日期列的值并赋值给成员变量
mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);
// 获取游标中背景颜色 ID 列的值并赋值给成员变量
mCreatedDate = c.getLong(CREATED_DATE_COLUMN);
// 获取游标中创建日期列的值并赋值给成员变量
mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN);
// 获取游标中是否有附件列的值并赋值给成员变量
mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN);
// 获取游标中修改日期列的值并赋值给成员变量
mParentId = c.getLong(PARENT_ID_COLUMN);
// 获取游标中父 ID 列的值并赋值给成员变量
mSnippet = c.getString(SNIPPET_COLUMN);
// 获取游标中摘要列的值并赋值给成员变量
mType = c.getInt(TYPE_COLUMN);
// 获取游标中类型列的值并赋值给成员变量
mWidgetId = c.getInt(WIDGET_ID_COLUMN);
// 获取游标中小部件 ID 列的值并赋值给成员变量
mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
// 获取游标中小部件类型列的值并赋值给成员变量
mVersion = c.getLong(VERSION_COLUMN);
// 获取游标中版本列的值并赋值给成员变量
}
private void loadDataContent() {
// 加载数据内容的私有方法
Cursor c = null;
// 初始化游标为 null
mDataList.clear();
// 清空数据列表
try {
c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,
"(note_id=?)", new String[]{
String.valueOf(mId)
}, null);
// 查询内容解析器,获取指定笔记 ID 的数据游标
if (c!= null) {
if (c.getCount() == 0) {
Log.w(TAG, "it seems that the note has not data");
// 如果游标计数为 0记录日志警告
return;
}
while (c.moveToNext()) {
SqlData data = new SqlData(mContext, c);
mDataList.add(data);
// 如果游标不为 null遍历游标并创建 SQL 数据对象添加到数据列表
}
} else {
Log.w(TAG, "loadDataContent: cursor = null");
// 如果游标为 null记录日志警告
}
} finally {
if (c!= null)
c.close(); // 最终,如果游标不为 null关闭游标
}
}
public boolean setContent(JSONObject js) {
// 设置内容的方法,接受 JSON 对象参数,返回布尔值
try {
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
// 从传入的 JSON 对象中获取名为 GTaskStringUtils.META_HEAD_NOTE 的 JSON 对象
if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
Log.w(TAG, "cannot set system folder");
// 如果类型为系统文件夹类型,记录日志警告并返回 false
return false;
} else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {
// 如果类型为文件夹类型
// for folder we can only update the snnipet and type
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;
// 获取 ID如果存在则获取否则为无效值
if (mIsCreate || mId!= id) {
mDiffNoteValues.put(NoteColumns.ID, id);
}
// 如果为创建状态或 ID 与当前不同,将 ID 添加到差异笔记值中
mId = id; // 更新 ID 变量
long alertDate = note.has(NoteColumns.ALERTED_DATE)? note
.getLong(NoteColumns.ALERTED_DATE) : 0; // 获取提醒日期,如果存在则获取,否则为 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);
// 获取背景颜色 ID如果存在则获取否则为默认背景颜色 ID
if (mIsCreate || mBgColorId!= bgColorId) {
mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId);
}
// 如果为创建状态或背景颜色 ID 与当前不同,将背景颜色 ID 添加到差异笔记值中
mBgColorId = bgColorId; // 更新背景颜色 ID 变量
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;
// 判断 JSON 对象 note 中是否存在 HAS_ATTACHMENT 字段,如果有则获取其整数值,否则将 hasAttachment 初始化为 0。
if (mIsCreate || mHasAttachment!= hasAttachment) {
mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment);
}
// 如果当前处于创建状态或者当前的 hasAttachment 值与新获取的值不同,则将新的 hasAttachment 值放入差异笔记值的 HAS_ATTACHMENT 字段中。
mHasAttachment = hasAttachment;
// 更新当前对象的 hasAttachment 变量。
long modifiedDate = note.has(NoteColumns.MODIFIED_DATE)? note
.getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis();
// 判断 JSON 对象 note 中是否存在 MODIFIED_DATE 字段,如果有则获取其长整数值,否则将 modifiedDate 初始化为当前时间戳。
if (mIsCreate || mModifiedDate!= modifiedDate) {
mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate);
}
// 如果当前处于创建状态或者当前的 modifiedDate 值与新获取的值不同,则将新的 modifiedDate 值放入差异笔记值的 MODIFIED_DATE 字段中。
mModifiedDate = modifiedDate;
// 更新当前对象的 modifiedDate 变量。
long parentId = note.has(NoteColumns.PARENT_ID)? note
.getLong(NoteColumns.PARENT_ID) : 0;
// 判断 JSON 对象 note 中是否存在 PARENT_ID 字段,如果有则获取其长整数值,否则将 parentId 初始化为 0。
if (mIsCreate || mParentId!= parentId) {
mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId);
}
// 如果当前处于创建状态或者当前的 parentId 值与新获取的值不同,则将新的 parentId 值放入差异笔记值的 PARENT_ID 字段中。
mParentId = parentId;
// 更新当前对象的 parentId 变量。
String snippet = note.has(NoteColumns.SNIPPET)? note
.getString(NoteColumns.SNIPPET) : "";
// 判断 JSON 对象 note 中是否存在 SNIPPET 字段,如果有则获取其字符串值,否则将 snippet 初始化为空字符串。
if (mIsCreate ||!mSnippet.equals(snippet)) {
mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
}
// 如果当前处于创建状态或者当前的 snippet 值与新获取的值不同,则将新的 snippet 值放入差异笔记值的 SNIPPET 字段中
mSnippet = snippet;
// 更新当前对象的 snippet 变量。
int type = note.has(NoteColumns.TYPE)? note.getInt(NoteColumns.TYPE)
: Notes.TYPE_NOTE;
// 判断 JSON 对象 note 中是否存在 TYPE 字段,如果有则获取其整数值,否则将 type 初始化为笔记类型。
if (mIsCreate || mType!= type) {
mDiffNoteValues.put(NoteColumns.TYPE, type);
}
// 如果当前处于创建状态或者当前的 type 值与新获取的值不同,则将新的 type 值放入差异笔记值的 TYPE 字段中。
mType = type; // 更新当前对象的 type 变量。
int widgetId = note.has(NoteColumns.WIDGET_ID)? note.getInt(NoteColumns.WIDGET_ID)
: AppWidgetManager.INVALID_APPWIDGET_ID;
// 判断 JSON 对象 note 中是否存在 WIDGET_ID 字段,如果有则获取其整数值,否则将 widgetId 初始化为无效小部件 ID。
if (mIsCreate || mWidgetId!= widgetId) {
mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId);
}
// 如果当前处于创建状态或者当前的 widgetId 值与新获取的值不同,则将新的 widgetId 值放入差异笔记值的 WIDGET_ID 字段中。
mWidgetId = widgetId;
// 更新当前对象的 widgetId 变量。
int widgetType = note.has(NoteColumns.WIDGET_TYPE)? note
.getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE;
// 判断 JSON 对象 note 中是否存在 WIDGET_TYPE 字段,如果有则获取其整数值,否则将 widgetType 初始化为无效小部件类型。
if (mIsCreate || mWidgetType!= widgetType) {
mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType);
}
// 如果当前处于创建状态或者当前的 widgetType 值与新获取的值不同,则将新的 widgetType 值放入差异笔记值的 WIDGET_TYPE 字段中。
mWidgetType = widgetType; // 更新当前对象的 widgetType 变量。
long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID)? note
.getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; // 判断 JSON 对象 note 中是否存在 ORIGIN_PARENT_ID 字段,如果有则获取其长整数值,否则将 originParent 初始化为 0。
if (mIsCreate || mOriginParent!= originParent) {
mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent);
}
// 如果当前处于创建状态或者当前的 originParent 值与新获取的值不同,则将新的 originParent 值放入差异笔记值的 ORIGIN_PARENT_ID 字段中。
mOriginParent = originParent;
// 更新当前对象的 originParent 变量。
for (int i = 0; i < dataArray.length(); i++) {
JSONObject data = dataArray.getJSONObject(i); // 从 JSON 数组 dataArray 中获取第 i 个元素,即一个 JSON 对象,并赋值给 data。
SqlData sqlData = null; // 初始化一个 SqlData 对象为 null。
if (data.has(DataColumns.ID)) {
long dataId = data.getLong(DataColumns.ID); // 如果 data 中包含 ID 字段,则获取其长整数值并赋值给 dataId。
for (SqlData temp : mDataList) {
if (dataId == temp.getId()) {
sqlData = temp;
}
}
// 在当前对象的 mDataList 中遍历每个 SqlData 对象 temp如果 dataId 与 temp 的 ID 相等,则将 temp 赋值给 sqlData。
}
if (sqlData == null) {
sqlData = new SqlData(mContext);
mDataList.add(sqlData);
}
// 如果 sqlData 为 null即没有找到匹配的 SqlData 对象,则创建一个新的 SqlData 对象并添加到 mDataList 中。
sqlData.setContent(data);
// 调用 sqlData 的 setContent 方法,将当前的 data 对象作为参数传入。
}
public JSONObject getContent() {
try {
JSONObject js = new JSONObject();
// 创建一个新的 JSON 对象 js。
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
}
// 如果当前处于创建状态,则记录日志并返回 null。
JSONObject note = new JSONObject();
// 创建一个新的 JSON 对象 note。
if (mType == Notes.TYPE_NOTE) {
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);
js.put(GTaskStringUtils.META_HEAD_NOTE, note);
// 如果当前对象的类型是笔记类型,则将各种属性放入 note 中,并将 note 放入 js 的特定键下。
JSONArray dataArray = new JSONArray();
for (SqlData sqlData : mDataList) {
JSONObject data = sqlData.getContent();
if (data!= null) {
dataArray.put(data);
}
}
js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
// 创建一个新的 JSON 数组 dataArray遍历数据列表获取每个 SqlData 的内容放入 JSON 数组中,再将 dataArray 放入 js 的特定键下。
} else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {
note.put(NoteColumns.ID, mId);
note.put(NoteColumns.TYPE, mType);
note.put(NoteColumns.SNIPPET, mSnippet);
js.put(GTaskStringUtils.META_HEAD_NOTE, note);
}
// 如果当前对象的类型是文件夹类型或系统类型,则只将 ID、类型和摘要放入 note 中,再将 note 放入 js 的特定键下。
return js;
} catch (JSONException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
return null;
}
public void setParentId(long id) {
mParentId = id; // 更新当前对象的父 ID 变量。
mDiffNoteValues.put(NoteColumns.PARENT_ID, id); // 将新的父 ID 放入差异笔记值的 PARENT_ID 字段中。
}
public void setGtaskId(String gid) {
mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); // 将新的 GTask ID 放入差异笔记值的 GTASK_ID 字段中。
}
public void setSyncId(long syncId) {
mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); // 将新的同步 ID 放入差异笔记值的 SYNC_ID 字段中。
}
public void resetLocalModified() {
mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); // 将本地修改状态设置为 0并放入差异笔记值的 LOCAL_MODIFIED 字段中
}
public long getId() {
return mId; // 返回当前对象的 ID。
}
public long getParentId() {
return mParentId; // 返回当前对象的父 ID
}
public String getSnippet() {
return mSnippet; // 返回当前对象的摘要
}
public boolean isNoteType() {
return mType == Notes.TYPE_NOTE;
// 判断是否是笔记类型的方法。如果当前对象的类型等于笔记类型,则返回 true否则返回 false。
}
public void commit(boolean validateVersion) {
if (mIsCreate) {
if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
mDiffNoteValues.remove(NoteColumns.ID);
}
// 如果当前处于创建状态且 ID 为无效值且差异笔记值中包含 ID 字段,则移除该 ID 字段。
Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues);
try {
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。如果插入失败则抛出异常。
if (mId == 0) {
throw new IllegalStateException("Create thread id failed");
}
// 如果当前 ID 为 0则抛出非法状态异常。
if (mType == Notes.TYPE_NOTE) {
for (SqlData sqlData : mDataList) {
sqlData.commit(mId, false, -1);
}
}
// 如果类型是笔记类型,则对数据列表中的每个 SqlData 对象调用提交方法。
} else {
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");
}
// 如果不是创建状态且 ID 无效(不等于根文件夹 ID 和通话记录文件夹 ID则抛出异常。
if (mDiffNoteValues.size() > 0) {
mVersion++;
int result = 0;
if (!validateVersion) {
result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
+ NoteColumns.ID + "=?)", new String[]{
String.valueOf(mId)
});
} else {
result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
+ NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)",
new String[]{
String.valueOf(mId), String.valueOf(mVersion)
});
}
if (result == 0) {
Log.w(TAG, "there is no update. maybe user updates note when syncing");
}
}
// 如果差异笔记值不为空,则更新版本号,并根据 validateVersion 的值选择不同的更新方式。如果更新结果为 0则记录日志警告。
if (mType == Notes.TYPE_NOTE) {
for (SqlData sqlData : mDataList) {
sqlData.commit(mId, validateVersion, mVersion);
}
}
// 如果类型是笔记类型,则对数据列表中的每个 SqlData 对象调用提交方法。
}
// refresh local info
loadFromCursor(mId);
if (mType == Notes.TYPE_NOTE)
loadDataContent(); // 刷新本地信息,根据 ID 重新加载当前对象的数据,如果类型是笔记类型,则加载数据内容。
mDiffNoteValues.clear();
mIsCreate = false; // 清空差异笔记值,并设置为非创建状态。
}