diff --git a/doc/小米便签维护验收PPT.pptx b/doc/小米便签维护验收PPT.pptx new file mode 100644 index 0000000..9d83991 Binary files /dev/null and b/doc/小米便签维护验收PPT.pptx differ diff --git a/src/Notes-master/.idea/caches/build_file_checksums.ser b/src/Notes-master/.idea/caches/build_file_checksums.ser deleted file mode 100644 index db95d16..0000000 Binary files a/src/Notes-master/.idea/caches/build_file_checksums.ser and /dev/null differ diff --git a/src/Notes-master/.idea/markdown-navigator-enh.xml b/src/Notes-master/.idea/markdown-navigator-enh.xml new file mode 100644 index 0000000..a8fcc84 --- /dev/null +++ b/src/Notes-master/.idea/markdown-navigator-enh.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/markdown-navigator.xml b/src/Notes-master/.idea/markdown-navigator.xml new file mode 100644 index 0000000..57b84e5 --- /dev/null +++ b/src/Notes-master/.idea/markdown-navigator.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/Notes-master.iml b/src/Notes-master/.idea/modules/Notes-master.iml index 21ca423..7ec378f 100644 --- a/src/Notes-master/.idea/modules/Notes-master.iml +++ b/src/Notes-master/.idea/modules/Notes-master.iml @@ -17,4 +17,8 @@ + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/app/Notes-master.app.iml b/src/Notes-master/.idea/modules/app/Notes-master.app.iml index e9f35bf..87830b7 100644 --- a/src/Notes-master/.idea/modules/app/Notes-master.app.iml +++ b/src/Notes-master/.idea/modules/app/Notes-master.app.iml @@ -50,4 +50,8 @@ + + \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarIssues.xml b/src/Notes-master/.idea/sonarIssues.xml new file mode 100644 index 0000000..465ef5e --- /dev/null +++ b/src/Notes-master/.idea/sonarIssues.xml @@ -0,0 +1,39 @@ + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarlint/issuestore/3/a/3aac5305cb73bfbdeb8078cd264d04323fa80e92 b/src/Notes-master/.idea/sonarlint/issuestore/3/a/3aac5305cb73bfbdeb8078cd264d04323fa80e92 new file mode 100644 index 0000000..e69de29 diff --git a/src/Notes-master/.idea/sonarlint/issuestore/9/3/934a4e2abf19d28a53f6aeb1dcd99248c44b6892 b/src/Notes-master/.idea/sonarlint/issuestore/9/3/934a4e2abf19d28a53f6aeb1dcd99248c44b6892 new file mode 100644 index 0000000..a0df7ff --- /dev/null +++ b/src/Notes-master/.idea/sonarlint/issuestore/9/3/934a4e2abf19d28a53f6aeb1dcd99248c44b6892 @@ -0,0 +1,5 @@ + +2 +java:S2386,"Make this member "protected".(X +n +java:S3776"RRefactor this method to reduce its Cognitive Complexity from 16 to the 15 allowed.( \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarlint/issuestore/c/1/c182d0c9c237ea8a46a92ccaae9bb5c751923a88 b/src/Notes-master/.idea/sonarlint/issuestore/c/1/c182d0c9c237ea8a46a92ccaae9bb5c751923a88 new file mode 100644 index 0000000..fd4c7f2 --- /dev/null +++ b/src/Notes-master/.idea/sonarlint/issuestore/c/1/c182d0c9c237ea8a46a92ccaae9bb5c751923a88 @@ -0,0 +1,3 @@ + +[ +java:S1124"EReorder the modifiers to comply with the Java Language Specification.( \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarlint/issuestore/d/1/d187f1271655c3d91661a39fe6de395b6a9f290a b/src/Notes-master/.idea/sonarlint/issuestore/d/1/d187f1271655c3d91661a39fe6de395b6a9f290a new file mode 100644 index 0000000..f59a333 --- /dev/null +++ b/src/Notes-master/.idea/sonarlint/issuestore/d/1/d187f1271655c3d91661a39fe6de395b6a9f290a @@ -0,0 +1,3 @@ + +i +java:S3776"RRefactor this method to reduce its Cognitive Complexity from 16 to the 15 allowed.(ǎ \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarlint/issuestore/e/0/e094aec5c3e1b6f44539adff3114f5a1ad603ddc b/src/Notes-master/.idea/sonarlint/issuestore/e/0/e094aec5c3e1b6f44539adff3114f5a1ad603ddc new file mode 100644 index 0000000..75d7970 --- /dev/null +++ b/src/Notes-master/.idea/sonarlint/issuestore/e/0/e094aec5c3e1b6f44539adff3114f5a1ad603ddc @@ -0,0 +1,8 @@ + +r +java:S3923"[Remove this conditional structure or edit its code blocks so that they're not all the same.(ԡ + +java:S1319"pThe return type of this method should be an interface such as "List" rather than the implementation "ArrayList".(ﷺ +t +java:S2293*"YReplace the type specification in this constructor call with the diamond operator ("<>").(ʩ +Y java:S125"").( +u +java:S2293"YReplace the type specification in this constructor call with the diamond operator ("<>").( +n +java:S3776"RRefactor this method to reduce its Cognitive Complexity from 91 to the 15 allowed.( +2 +java:S2386."Make this member "protected".(u +u +java:S2293"YReplace the type specification in this constructor call with the diamond operator ("<>").( \ No newline at end of file diff --git a/src/Notes-master/.idea/sonarlint/issuestore/f/4/f4a01d6a4fcb971362ec00a83903fd3902f52164 b/src/Notes-master/.idea/sonarlint/issuestore/f/4/f4a01d6a4fcb971362ec00a83903fd3902f52164 new file mode 100644 index 0000000..e69de29 diff --git a/src/Notes-master/.idea/sonarlint/issuestore/index.pb b/src/Notes-master/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 0000000..b513b71 --- /dev/null +++ b/src/Notes-master/.idea/sonarlint/issuestore/index.pb @@ -0,0 +1,15 @@ + +@ +app/build.gradle,f\4\f4a01d6a4fcb971362ec00a83903fd3902f52164 +k +;app/src/main/java/net/micode/notes/gtask/data/MetaData.java,c\1\c182d0c9c237ea8a46a92ccaae9bb5c751923a88 +g +7app/src/main/java/net/micode/notes/gtask/data/Node.java,3\a\3aac5305cb73bfbdeb8078cd264d04323fa80e92 +j +:app/src/main/java/net/micode/notes/gtask/data/SqlData.java,9\3\934a4e2abf19d28a53f6aeb1dcd99248c44b6892 +j +:app/src/main/java/net/micode/notes/gtask/data/SqlNote.java,f\1\f1226eeacd46c914d51f3d1a6d6f27377490d2a4 +g +7app/src/main/java/net/micode/notes/gtask/data/Task.java,d\1\d187f1271655c3d91661a39fe6de395b6a9f290a +k +;app/src/main/java/net/micode/notes/gtask/data/TaskList.java,e\0\e094aec5c3e1b6f44539adff3114f5a1ad603ddc \ No newline at end of file diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java index 3a2050b..9250255 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java @@ -24,39 +24,51 @@ import net.micode.notes.tool.GTaskStringUtils; import org.json.JSONException; import org.json.JSONObject; - +// 功能描述:主要是描述数据属性(property)的信息,用来支持例如指示存储位置、历史数据、资源查找、文件记录等功能。 +//实现:继承task类,用于记录数据的变化 public class MetaData extends Task { + // 调用getSimpleName ()函数得到类的简写名称存入字符串TAG中 private final static String TAG = MetaData.class.getSimpleName(); - + // 相关GID文件 (GID文件用来保存帮助文件的信息) private String mRelatedGid = null; - + // 调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数,实现设置数据,即生成元数据库 public void setMeta(String gid, JSONObject metaInfo) { try { + // 将这对键值放入metaInfo这个jsonobject对象中 metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); + // 捕捉异常放入TAG } catch (JSONException e) { Log.e(TAG, "failed to put related gid"); } + // 设置便签,将json类的metainfo转换为String setNotes(metaInfo.toString()); + // 设置gtask名字 setName(GTaskStringUtils.META_NOTE_NAME); } - + // 获取相关联的Gid public String getRelatedGid() { return mRelatedGid; } @Override + //判断是否值得存放,即当前数据是否有效,若数据非空则返回真值 public boolean isWorthSaving() { return getNotes() != null; } @Override + //功能:使用远程json数据对象设置元数据内容 + //实现:调用父类Task中的setContentByRemoteJSON ()函数,如果获取的notes非空,则去掉获取notes的空格后存入metaInfo中,并从metaInfo获取键值来获取相关gid;如果为空,则抛出异常 + //参数:js属于JSONObject类,属于远程的数据 public void setContentByRemoteJSON(JSONObject js) { + //普通的直接引用。与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。 super.setContentByRemoteJSON(js); if (getNotes() != null) { try { JSONObject metaInfo = new JSONObject(getNotes().trim()); mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); } catch (JSONException e) { + // 输出异常 Log.w(TAG, "failed to get related gid"); mRelatedGid = null; } @@ -64,17 +76,20 @@ public class MetaData extends Task { } @Override + //功能:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 public void setContentByLocalJSON(JSONObject js) { // this function should not be called throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); } @Override + // 功能:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 public JSONObject getLocalJSONFromContent() { throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); } @Override + // 功能:获取同步动作状态,一般不会用到,若用到,则抛出异常 public int getSyncAction(Cursor c) { throw new IllegalAccessError("MetaData:getSyncAction should not be called"); } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java index 63950e0..88eaa20 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java @@ -20,6 +20,7 @@ import android.database.Cursor; import org.json.JSONObject; +// 建立node类来提供模板,设置各种参数及定义各种函数,会在别的地方用到,定义了各种同步活动的标识码 public abstract class Node { public static final int SYNC_ACTION_NONE = 0; @@ -46,14 +47,14 @@ public abstract class Node { private long mLastModified; private boolean mDeleted; - + //实现:设置mgid为空,名字为空,最后一次修改时间为0(没有修改),mDeleted为false表示未删除。 public Node() { mGid = null; mName = ""; mLastModified = 0; mDeleted = false; } - + // 创建JSONObject对象,创建操作和更新操作,参数为int actionid public abstract JSONObject getCreateAction(int actionId); public abstract JSONObject getUpdateAction(int actionId); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java index d3ec3be..5c4f186 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -36,6 +36,7 @@ import org.json.JSONObject; public class SqlData { + //调用getSimpleName ()函数将类的简写名称存入string类型变量TAG中 private static final String TAG = SqlData.class.getSimpleName(); private static final int INVALID_ID = -99999; @@ -70,7 +71,8 @@ public class SqlData { private String mDataContentData3; private ContentValues mDiffDataValues; - + //功能:第一种构造函数,初始化 + //参数:类型为context,从上下文获取,初始化其中变量 public SqlData(Context context) { mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -81,14 +83,17 @@ public class SqlData { mDataContentData3 = ""; mDiffDataValues = new ContentValues(); } - + //功能:第二中构造函数,初始化 + //实现:通过游标cursor c来获取数据,进行替换 + //参数:游标c是将传进来的参数替换掉初始的数值 public SqlData(Context context, Cursor c) { mContentResolver = context.getContentResolver(); mIsCreate = false; loadFromCursor(c); mDiffDataValues = new ContentValues(); } - + //功能:从光标处加载数据,DATA_ID_COLUMN等参数为0,1,2,3,4,应为获取五列参数 + //实现:用各种get函数获取相关值 private void loadFromCursor(Cursor c) { mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); @@ -96,16 +101,23 @@ public class SqlData { mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - + //功能:设置共享数据并提供异常抛出与处理机制 + //实现:首先js判断是否有DataColumns.ID,然后判断是否为第一种构造方式,将DataColumns.ID列和对应dataId列值加入到SQLData中, + //然后更新mDataId,最后判断并设置mDataMimeType、mDataContent等需共享的数据 public void setContent(JSONObject js) throws JSONException { + // 如果传入JSONObject有DataColumns.ID,则dataID = DataColumns.ID,否则设置为INVALID_ID=-99999 long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + //如果mIsCreate为True(根据第一种构造方式)或者mDataId(当前数据的ID)与dataId(元数据的ID)不符。 + //第一种构造方式只是简单的初始化,没具体内容 if (mIsCreate || mDataId != dataId) { + // 将DataColumns.ID列和对应dataId列值加入到SQLData中 mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; - + // 判断并更新 String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) : DataConstants.NOTE; + // 这个对象的MimeType不和(dataMimeType)共享数据一样,则将共享数据.MIME_TYPE加入数据库中 if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); } @@ -129,7 +141,8 @@ public class SqlData { } mDataContentData3 = dataContentData3; } - + //功能:获取共享的数据内容,并提供异常抛出与处理机制 + //实现:根据mIsCreate判断初始化类型,如果为第一种无内容的初始化,则返回null,否则,将要共享的内容存入JSONObject类的js中 public JSONObject getContent() throws JSONException { if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); @@ -143,7 +156,9 @@ public class SqlData { js.put(DataColumns.DATA3, mDataContentData3); return js; } - + //功能:commit 函数用于把当前所做的修改保存到数据库 + //实现:首先判断构造方式,如果为第一种构造方式,判断是否为有效然后更新共享数据;如果为第二种构造方式,首先判断要共享的数据mDiffDataValues是否存在,然后确认版本,如果版本还没有确认,则记录id和data,如果已经确认,则更新对应版本ID,最后将要共享的数据清空,回到初始化,表示已经共享 + //参数:long类型的noteId,boolean类型的validateVersion用于版本确认,long类型的version为版本号 public void commit(long noteId, boolean validateVersion, long version) { if (mIsCreate) { @@ -182,7 +197,7 @@ public class SqlData { mDiffDataValues.clear(); mIsCreate = false; } - + // 获取当前ID public long getId() { return mDataId; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java index f4d0011..5050a1d 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -77,13 +77,13 @@ public class SqlNote { public static final int WIDGET_TYPE_COLUMN = 11; public static final int SYNC_ID_COLUMN = 12; - + // 本地修改的符号 public static final int LOCAL_MODIFIED_COLUMN = 13; - + // 在进入临时文件夹之前,原始的父id(未使用) public static final int ORIGIN_PARENT_ID_COLUMN = 14; - + // 用户id public static final int GTASK_ID_COLUMN = 15; - + //版本 public static final int VERSION_COLUMN = 16; private Context mContext; @@ -121,7 +121,8 @@ public class SqlNote { private ContentValues mDiffNoteValues; private ArrayList mDataList; - + //第一种构造函数 + //构造函数,参数只有context,初始化新建的对象中的所有变量 public SqlNote(Context context) { mContext = context; mContentResolver = context.getContentResolver(); @@ -142,7 +143,8 @@ public class SqlNote { mDiffNoteValues = new ContentValues(); mDataList = new ArrayList(); } - + //第二种构造函数 + //参数有context和cursor,对cursor指向的对象进行初始化 public SqlNote(Context context, Cursor c) { mContext = context; mContentResolver = context.getContentResolver(); @@ -154,7 +156,8 @@ public class SqlNote { mDiffNoteValues = new ContentValues(); } - + //第三种构造方式 + //构造函数,参数有 context 和 id,对 id 指向的对象进行初始化 public SqlNote(Context context, long id) { mContext = context; mContentResolver = context.getContentResolver(); @@ -165,9 +168,11 @@ public class SqlNote { loadDataContent(); mDiffNoteValues = new ContentValues(); } - + //功能:通过id从光标处加载数据 + //实现:通过id获取ContentResolver中的相应内容,并赋给cursor,如果有内容就将移入文档,并再次等待光标的内容;否则日志显示警告,最后关闭光标,方法完毕 private void loadFromCursor(long id) { Cursor c = null; + //避免异常 try { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", new String[] { @@ -184,7 +189,8 @@ public class SqlNote { c.close(); } } - + //功能:通过cursor从光标加载数据 + //实现:各种get类型的函数,通过光标c获取参数 private void loadFromCursor(Cursor c) { mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); @@ -199,7 +205,10 @@ public class SqlNote { mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); mVersion = c.getLong(VERSION_COLUMN); } - + //功能:通过content机制获取共享数据并加载到数据库当前光标处 + //实现:获取ID对应content内容,如果查询到该note的id确实有对应项,即cursor有对应,获取ID对应content内容 + //如果光标处有内容,提示note无数据warning,当记录数量不为0,则循环直到记录不存在,不断地取出记录放到DataList中 + //如果cursor为空,警告,最终判断光标为空,则关闭 private void loadDataContent() { Cursor c = null; mDataList.clear(); @@ -225,16 +234,23 @@ public class SqlNote { c.close(); } } - + //功能:设置通过content机制用于共享的数据信息 + //实现:先判断是不是系统文件夹,再判断是否为文件夹类型,如果共享数据存在摘要,则将其赋给声明的 snippet变量,否则变量为空 + //如果SQLNote采用的是第一种构造方式,或者snippet为空,则将snippet这一项键值存入contentvalue中,尽管是“” + //如果是note,获取提示日期,设置用于共享数据的信息,最后遍历 dataArray,查找 id 为 dataId 的数据,更新sqlData public boolean setContent(JSONObject js) { try { 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) { + // snnipet——片段、片断 // for folder we can only update the snnipet and type String snippet = note.has(NoteColumns.SNIPPET) ? note .getString(NoteColumns.SNIPPET) : ""; + // 如果SQLNote采用的是第一种构造方式,或者snippet为空,则将snippet这一项键值存入contentvalue中,尽管是“” if (mIsCreate || !mSnippet.equals(snippet)) { mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); } @@ -246,7 +262,9 @@ public class SqlNote { mDiffNoteValues.put(NoteColumns.TYPE, type); } mType = type; + //如果是NOTE } 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) { @@ -358,7 +376,10 @@ public class SqlNote { } return true; } - + //功能:获取content机制提供的数据并加载到note中 + //实现:判断采用的是第一种构造方式,自然实施初始化而已,显示错误:没创建数据库 + //再判断如果对象的类型是note类型,这个对象的13项按键值对方式(ID, mId)、(ALERTED_DATE, mAlertDate)···加入note中 + //类型为系统文件或目录文件时,将id,类型,以及摘要,存入jsonobject,然后对应META_HEAD_NOTE键,存入共享 public JSONObject getContent() { try { JSONObject js = new JSONObject(); @@ -392,7 +413,9 @@ public class SqlNote { } } js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + // 类型为系统文件或目录文件时 } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { + // 将id,类型,以及摘要,存入jsonobject,然后对应META_HEAD_NOTE键,存入共享 note.put(NoteColumns.ID, mId); note.put(NoteColumns.TYPE, mType); note.put(NoteColumns.SNIPPET, mSnippet); @@ -406,7 +429,7 @@ public class SqlNote { } return null; } - + // 设置当前 id 的父 id public void setParentId(long id) { mParentId = id; mDiffNoteValues.put(NoteColumns.PARENT_ID, id); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java index 1c42e99..97d24c9 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java @@ -31,7 +31,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; - +// 创建Task类,继承自父类Node public class Task extends Node { private static final String TAG = Task.class.getSimpleName(); @@ -44,7 +44,8 @@ public class Task extends Node { private Task mPriorSibling; private TaskList mParent; - + //功能:Task类的构造函数,对对象进行初始化 + //实现:调用父类构造方法,对变量初始化 public Task() { super(); mCompleted = false; @@ -53,12 +54,16 @@ public class Task extends Node { mParent = null; mMetaInfo = null; } - + //功能:获取创建的action。获取当前创建的action的属性值,比如说它的id号、类型、index值。 + //实现:首先新建一个 JSONObject 的对象js用来存放同步过程中所用到的 task 信息,然后在共享数据js里存入action_type、action_id、index + //再新建一个 JSONObject 对象entity打包存放 name,creator id,type task,判断是否有notes,有则将其也放入entity中 + //最后将entity、parent_id、dest_parent_type、list_id存入js中,判断如果存在优先兄弟 task,则将其 id 放入 js 中 public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); try { // action_type + // 共享数据存入动作类型action_ type js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); @@ -69,11 +74,13 @@ public class Task extends Node { js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); // entity_delta + // 新建一个 JSONObject 对象打包存放 name,creator id,type task JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_TASK); + // 如果存在 notes ,则将其也放入 entity 中 if (getNotes() != null) { entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } @@ -102,7 +109,8 @@ public class Task extends Node { return js; } - + //功能:获取更新的action + //实现:和上面getCreateAction差不多 public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); @@ -134,7 +142,8 @@ public class Task extends Node { return js; } - + //功能:通过远端的jsonobject获取任务内容 + //实现:首先判断js是否非空,接着判断如果有id这个变量,就进行gid的设置,同样方法设置last_modified、name等变量 public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { @@ -174,7 +183,10 @@ public class Task extends Node { } } } - + //功能:通过本地的jsonobject获取内容 + //实现:首先判断js是否为空或者没有META_HEAD_NOTE,为空则显示日志,创建JSONObject类note存入js的META_HEAD_NOTE + //创建JSONArray类dataArray存入META_HEAD_DATA,判断note的TYPE不能匹配Notes的TYPE则无效 + //最后遍历 dataArray 查找与数据库中DataConstants.NOTE 记录信息一致的 data public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { @@ -203,7 +215,8 @@ public class Task extends Node { } } } - + //功能:通过Content机制获取本地JSON数据。 + //实现:通过判断元数据是否存在,如果不存在,则创建一个新的对象,并将信息完善。最后返回js对象。 public JSONObject getLocalJSONFromContent() { String name = getName(); try { @@ -246,7 +259,8 @@ public class Task extends Node { return null; } } - + //功能:设置元数据信息 + //参数:MetaData类 metaData,元数据 public void setMetaInfo(MetaData metaData) { if (metaData != null && metaData.getNotes() != null) { try { @@ -257,7 +271,8 @@ public class Task extends Node { } } } - + //功能:获取同步操作 + //实现:判断mMetaInfo是否被删除或者远程数据被删除,然后判断光标传入的note ID是否匹配并判断本地的便签数据是否已更新 public int getSyncAction(Cursor c) { try { JSONObject noteInfo = null; @@ -310,16 +325,17 @@ public class Task extends Node { return SYNC_ACTION_ERROR; } - + //功能:判断是否值得存放,即当前数据是否有效,若数据非空 或 名字合法存在且去除空格后的名字长度大于零则返回真值。 + // 其它:trim() 的作用是去除字符串前后的空格:public String trim()返回字符串的副本,忽略前导空白和尾部空白 public boolean isWorthSaving() { return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } - + // 将task设置为修改完毕 public void setCompleted(boolean completed) { this.mCompleted = completed; } - + // 设定mNotes public void setNotes(String notes) { this.mNotes = notes; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java index 6444a4e..d1a70c9 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -42,7 +42,8 @@ public class TaskList extends Node { mChildren = new ArrayList(); mIndex = 1; } - + //功能:获取生成动作 + //实现:创建JSONObject js存入action_type、action_id、index、entity_delta,生成并返回一个包含了一定数据的JSONObject实体 public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); @@ -73,7 +74,8 @@ public class TaskList extends Node { return js; } - + //功能:接受更新action,返回jsonobject + //实现:同上面getCreateAction类似 public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); @@ -102,7 +104,8 @@ public class TaskList extends Node { return js; } - + //功能:通过云端 JSON 数据设置实例化对象 js 的内容 + //实现:通过传入的js判断非空,然后设置id、last_modified、name public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { @@ -128,7 +131,8 @@ public class TaskList extends Node { } } } - + //功能:通过本地 JSON 数据设置对象 js 内容 + //实现:实现方法也与上面setContentByRemoteJSON类似,不过设置的是根据本地js传入 public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); @@ -159,7 +163,8 @@ public class TaskList extends Node { e.printStackTrace(); } } - + //功能:从content获取本地json + //实现:getname()函数获取文件夹名称 public JSONObject getLocalJSONFromContent() { try { JSONObject js = new JSONObject(); @@ -185,7 +190,12 @@ public class TaskList extends Node { return null; } } - + //功能:通过 cursor 获取同步信息 + //实现:首先判断本地记录是否被修改,如果没有修改,再判断光标处的ID与最后一次修改是否相等 + //如果相等则返回“不同步”,如果不等则返回“同步” + //如果本地记录已经修改,则判断获取的ID是否匹配,若不匹配则返回同步动作失败 + //其它:“同步”是指将remote端更新至local端。另外为什么 if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) + //为什么这个判断最后 if else返回的都是SYNC_ACTION_UPDATE_REMOTE? public int getSyncAction(Cursor c) { try { if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { @@ -222,7 +232,10 @@ public class TaskList extends Node { public int getChildTaskCount() { return mChildren.size(); } - + //功能:在当前任务表中添加新的子任务 + //实现:如果传入的子任务不是空并且当前的子任务序列中不含有该任务,就将这个任务加入子任务中 + //然后设置兄弟任务优先级,若子任务为空,返回 NULL,否则返回子任务数量-1,最后设置该任务的父任务 + //返回值为是否成功添加任务 public boolean addChildTask(Task task) { boolean ret = false; if (task != null && !mChildren.contains(task)) { @@ -236,7 +249,9 @@ public class TaskList extends Node { } return ret; } - + //功能:在当前任务表的指定位置添加新的任务。 + //实现:先获取要添加的任务在任务表中的位置,在索引位置添加任务,update the task list + //然后让插入的任务与前后连在一块,将下一个任务设置兄弟任务优先级 public boolean addChildTask(Task task, int index) { if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); @@ -262,7 +277,8 @@ public class TaskList extends Node { return true; } - + //功能:删除TaskList中的一个Task + //实现:方法同addChildTask()类似 public boolean removeChildTask(Task task) { boolean ret = false; int index = mChildren.indexOf(task); @@ -283,7 +299,7 @@ public class TaskList extends Node { } return ret; } - + // 功能:将当前TaskList中含有的某个Task移到index位置 public boolean moveChildTask(Task task, int index) { if (index < 0 || index >= mChildren.size()) { @@ -301,7 +317,8 @@ public class TaskList extends Node { return true; return (removeChildTask(task) && addChildTask(task, index)); } - + //功能:通过Gid寻找子任务(未使用) + //实现:从头至尾遍历整个任务列表判断任务的gid与传入的gid是否相等 public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); @@ -311,11 +328,11 @@ public class TaskList extends Node { } return null; } - + // 获取子任务索引列表 public int getChildTaskIndex(Task task) { return mChildren.indexOf(task); } - + // 返回指定index的Task public Task getChildTaskByIndex(int index) { if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "getTaskByIndex: invalid index"); @@ -323,7 +340,7 @@ public class TaskList extends Node { } return mChildren.get(index); } - + // 返回指定gid的Task public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { if (task.getGid().equals(gid)) @@ -331,7 +348,7 @@ public class TaskList extends Node { } return null; } - + //获取子任务列表 public ArrayList getChildTaskList() { return this.mChildren; } diff --git a/src/Notes-master/local.properties b/src/Notes-master/local.properties index 11be78c..fd1d5d6 100644 --- a/src/Notes-master/local.properties +++ b/src/Notes-master/local.properties @@ -4,5 +4,5 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Sat Nov 21 11:26:00 CST 2020 -sdk.dir=D\:\\Sdk +#Wed Dec 02 20:10:32 CST 2020 +sdk.dir=C\:\\Users\\95459\\AppData\\Local\\Android\\Sdk