|
|
@ -37,7 +37,14 @@ import org.json.JSONObject;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @Package: net.micode.notes.gtask.data
|
|
|
|
|
|
|
|
* @ClassName: SqlNote
|
|
|
|
|
|
|
|
* @Description:
|
|
|
|
|
|
|
|
* SqlNote类包含用于处理小米便签的数据库操作,是一个用于管理便签数据的工具类
|
|
|
|
|
|
|
|
* @Author: Dong Jiaqi
|
|
|
|
|
|
|
|
* @CreateDate: 12/24/2023 17:18 PM
|
|
|
|
|
|
|
|
*/
|
|
|
|
public class SqlNote {
|
|
|
|
public class SqlNote {
|
|
|
|
private static final String TAG = SqlNote.class.getSimpleName();
|
|
|
|
private static final String TAG = SqlNote.class.getSimpleName();
|
|
|
|
|
|
|
|
|
|
|
@ -52,9 +59,9 @@ public class SqlNote {
|
|
|
|
NoteColumns.VERSION
|
|
|
|
NoteColumns.VERSION
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
public static final int ID_COLUMN = 0;
|
|
|
|
public static final int ID_COLUMN = 0;//便签的ID列的索引为0
|
|
|
|
|
|
|
|
|
|
|
|
public static final int ALERTED_DATE_COLUMN = 1;
|
|
|
|
public static final int ALERTED_DATE_COLUMN = 1;//提醒日期列的索引为1
|
|
|
|
|
|
|
|
|
|
|
|
public static final int BG_COLOR_ID_COLUMN = 2;
|
|
|
|
public static final int BG_COLOR_ID_COLUMN = 2;
|
|
|
|
|
|
|
|
|
|
|
@ -120,8 +127,12 @@ public class SqlNote {
|
|
|
|
|
|
|
|
|
|
|
|
private ContentValues mDiffNoteValues;
|
|
|
|
private ContentValues mDiffNoteValues;
|
|
|
|
|
|
|
|
|
|
|
|
private ArrayList<SqlData> mDataList;
|
|
|
|
private ArrayList<SqlData> mDataList;//用Java中的ArrayList类定义了一个SqlData对象 mDataList,用于存储从数据库查询中返回的便签数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 构造方法,用来创建一个新的SqlNote对象,初始化新的 SqlNote 对象,并将其成员变量设置为默认值。
|
|
|
|
|
|
|
|
* @param context 要使用到的上下文对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
public SqlNote(Context context) {
|
|
|
|
public SqlNote(Context context) {
|
|
|
|
mContext = context;
|
|
|
|
mContext = context;
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
@ -143,6 +154,11 @@ public class SqlNote {
|
|
|
|
mDataList = new ArrayList<SqlData>();
|
|
|
|
mDataList = new ArrayList<SqlData>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 另外一个构造方法,用于创建一个新的 SqlNote 对象,并从给定的 Cursor 中加载数据。
|
|
|
|
|
|
|
|
* @param context 要使用的上下文对象
|
|
|
|
|
|
|
|
* @param c 要加载数据的游标对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
public SqlNote(Context context, Cursor c) {
|
|
|
|
public SqlNote(Context context, Cursor c) {
|
|
|
|
mContext = context;
|
|
|
|
mContext = context;
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
@ -154,6 +170,11 @@ public class SqlNote {
|
|
|
|
mDiffNoteValues = new ContentValues();
|
|
|
|
mDiffNoteValues = new ContentValues();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 另一个构造方法,用于创建一个新的 SqlNote 对象,并从给定的 ID 加载数据。
|
|
|
|
|
|
|
|
* @param context 要使用的上下文对象
|
|
|
|
|
|
|
|
* @param id 要加载数据的便签的ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
public SqlNote(Context context, long id) {
|
|
|
|
public SqlNote(Context context, long id) {
|
|
|
|
mContext = context;
|
|
|
|
mContext = context;
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
|
mContentResolver = context.getContentResolver();
|
|
|
@ -166,8 +187,17 @@ public class SqlNote {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 通过笔记 ID 从数据库中加载便签数据,并将其存储在 SqlNote 对象的成员变量中
|
|
|
|
|
|
|
|
* @param id 要加载数据的便签 ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void loadFromCursor(long id) {
|
|
|
|
private void loadFromCursor(long id) {
|
|
|
|
Cursor c = null;
|
|
|
|
Cursor c = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* try-finally语句块 用于在加载笔记数据后正确地关闭游标,以确保资源的释放。
|
|
|
|
|
|
|
|
* 这么写是为了避免在发生异常或错误时,游标未被关闭而导致资源泄漏。
|
|
|
|
|
|
|
|
* 通过在 finally 块中关闭游标,可以确保无论查询是否成功,都会正确地释放资源。
|
|
|
|
|
|
|
|
*/
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)",
|
|
|
|
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)",
|
|
|
|
new String[] {
|
|
|
|
new String[] {
|
|
|
@ -185,6 +215,10 @@ public class SqlNote {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 从游标中加载便签数据,并将其存储在 SqlNote 对象的成员变量中。
|
|
|
|
|
|
|
|
* @param c 要从中加载数据的游标
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void loadFromCursor(Cursor c) {
|
|
|
|
private void loadFromCursor(Cursor c) {
|
|
|
|
mId = c.getLong(ID_COLUMN);
|
|
|
|
mId = c.getLong(ID_COLUMN);
|
|
|
|
mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
|
|
|
|
mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
|
|
|
@ -200,9 +234,17 @@ public class SqlNote {
|
|
|
|
mVersion = c.getLong(VERSION_COLUMN);
|
|
|
|
mVersion = c.getLong(VERSION_COLUMN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据特定笔记 ID 加载与之关联的数据内容,并将其存储在数据列表中供进一步操作和展示。
|
|
|
|
|
|
|
|
* 通过查询数据库,遍历游标并创建相应的数据对象,可以方便地加载数据内容并进行后续处理。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void loadDataContent() {
|
|
|
|
private void loadDataContent() {
|
|
|
|
Cursor c = null;
|
|
|
|
Cursor c = null;
|
|
|
|
mDataList.clear();
|
|
|
|
mDataList.clear();
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 从数据库中查询与指定笔记 ID 相关联的数据内容,并将查询结果存储在 mDataList 列表中。
|
|
|
|
|
|
|
|
* 这种写法可以保证在出现异常时,也能正确地关闭游标,避免资源泄露和其他问题。
|
|
|
|
|
|
|
|
*/
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,
|
|
|
|
c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,
|
|
|
|
"(note_id=?)", new String[] {
|
|
|
|
"(note_id=?)", new String[] {
|
|
|
@ -226,7 +268,19 @@ public class SqlNote {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据传入的JSONObject对象设置内容。
|
|
|
|
|
|
|
|
* 根据JSONObject中的不同字段值更新类中的属性,并将差异值存储在mDiffNoteValues中。
|
|
|
|
|
|
|
|
* @param js 包含要设置的内容的JSONObject对象。
|
|
|
|
|
|
|
|
* @return 如果成功设置内容,则返回true;否则返回false
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean setContent(JSONObject js) {
|
|
|
|
public boolean setContent(JSONObject js) {
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* try块中的代码用于解析JSON对象并获取其中的数据。如果解析过程中发生了JSONException异常,那么程序会跳转到catch块中,并执行其中的代码。
|
|
|
|
|
|
|
|
* catch块中的代码主要用于打印异常信息并返回一个布尔值false,以表示解析失败。
|
|
|
|
|
|
|
|
* 这样能够通过捕获异常并进行适当的处理,可以避免程序崩溃或产生不可预料的结果。
|
|
|
|
|
|
|
|
*/
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
|
|
|
|
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
|
|
|
|
if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
|
|
|
|
if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
|
|
|
@ -237,14 +291,14 @@ public class SqlNote {
|
|
|
|
.getString(NoteColumns.SNIPPET) : "";
|
|
|
|
.getString(NoteColumns.SNIPPET) : "";
|
|
|
|
if (mIsCreate || !mSnippet.equals(snippet)) {
|
|
|
|
if (mIsCreate || !mSnippet.equals(snippet)) {
|
|
|
|
mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
|
|
|
|
mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
|
|
|
|
}
|
|
|
|
}//判断是否需要更新笔记的摘要(snippet)。它通过比较当前对象的mSnippet属性和传入的参数snippet,如果两者不相等,则将新的摘要值存储在mDiffNoteValues中。
|
|
|
|
mSnippet = snippet;
|
|
|
|
mSnippet = snippet;
|
|
|
|
|
|
|
|
|
|
|
|
int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
|
|
|
|
int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
|
|
|
|
: Notes.TYPE_NOTE;
|
|
|
|
: Notes.TYPE_NOTE;
|
|
|
|
if (mIsCreate || mType != type) {
|
|
|
|
if (mIsCreate || mType != type) {
|
|
|
|
mDiffNoteValues.put(NoteColumns.TYPE, type);
|
|
|
|
mDiffNoteValues.put(NoteColumns.TYPE, type);
|
|
|
|
}
|
|
|
|
}//检查是否正在创建新的笔记(mIsCreate为true),或者当前笔记的类型与传入的类型值不相等(mType != type)。如果满足其中一个条件,就会将新的类型值存储在mDiffNoteValues中。
|
|
|
|
mType = type;
|
|
|
|
mType = type;
|
|
|
|
} else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {
|
|
|
|
} else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {
|
|
|
|
JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
|
|
|
|
JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
|
|
|
@ -359,6 +413,10 @@ public class SqlNote {
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将当前对象的属性值转换为一个JSON对象并返回。
|
|
|
|
|
|
|
|
* @return 返回转换后的JSONObject对象作为结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
public JSONObject getContent() {
|
|
|
|
public JSONObject getContent() {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
JSONObject js = new JSONObject();
|
|
|
|
JSONObject js = new JSONObject();
|
|
|
@ -407,39 +465,74 @@ public class SqlNote {
|
|
|
|
return null;
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 设置当前对象的父级ID属性,并将该属性的值存储到mDiffNoteValues中。
|
|
|
|
|
|
|
|
* @param id long类型,表示要设置的父级ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void setParentId(long id) {
|
|
|
|
public void setParentId(long id) {
|
|
|
|
mParentId = id;
|
|
|
|
mParentId = id;
|
|
|
|
mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
|
|
|
|
mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将指定的Google Tasks任务的ID(gid)放入mDiffNoteValues中,以便后续判断属性变化时进行处理。
|
|
|
|
|
|
|
|
* @param gid 字符串类型,表示要设置的Google Tasks任务的ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void setGtaskId(String gid) {
|
|
|
|
public void setGtaskId(String gid) {
|
|
|
|
mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
|
|
|
|
mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将指定的同步ID(syncId)放入mDiffNoteValues中,以便后续判断属性变化时进行处理。
|
|
|
|
|
|
|
|
* @param syncId long类型,表示要设置的同步ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void setSyncId(long syncId) {
|
|
|
|
public void setSyncId(long syncId) {
|
|
|
|
mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);
|
|
|
|
mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将当前对象的本地修改状态重置为未修改。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void resetLocalModified() {
|
|
|
|
public void resetLocalModified() {
|
|
|
|
mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0);
|
|
|
|
mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取当前对象ID属性值,将其作为结果返回
|
|
|
|
|
|
|
|
* @return 当前对象的ID属性值
|
|
|
|
|
|
|
|
*/
|
|
|
|
public long getId() {
|
|
|
|
public long getId() {
|
|
|
|
return mId;
|
|
|
|
return mId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取当前对象的父级ID属性值,并返回该值。
|
|
|
|
|
|
|
|
* @return 当前对象的父级ID属性值
|
|
|
|
|
|
|
|
*/
|
|
|
|
public long getParentId() {
|
|
|
|
public long getParentId() {
|
|
|
|
return mParentId;
|
|
|
|
return mParentId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取当前对象的摘要属性值,并返回该值。
|
|
|
|
|
|
|
|
* @return 当前对象的摘要属性值
|
|
|
|
|
|
|
|
*/
|
|
|
|
public String getSnippet() {
|
|
|
|
public String getSnippet() {
|
|
|
|
return mSnippet;
|
|
|
|
return mSnippet;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 判断当前对象是否为“便签”类型。
|
|
|
|
|
|
|
|
* @return 布尔类型的数据,表示当前对象是否为“便签”类型。如果是便签类型,则返回true;否则返回false。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean isNoteType() {
|
|
|
|
public boolean isNoteType() {
|
|
|
|
return mType == Notes.TYPE_NOTE;
|
|
|
|
return mType == Notes.TYPE_NOTE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 将当前对象所代表的笔记或文件夹信息提交到数据库中进行保存,并更新当前对象的属性值。
|
|
|
|
|
|
|
|
* @param validateVersion 布尔类型的数据,表示是否需要验证版本信息。如果为true,则在更新时需要比较版本号;否则不需要比较版本号。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void commit(boolean validateVersion) {
|
|
|
|
public void commit(boolean validateVersion) {
|
|
|
|
if (mIsCreate) {
|
|
|
|
if (mIsCreate) {
|
|
|
|
if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
|
|
|
|
if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
|
|
|
|