diff --git a/doc/小米便签开源代码的泛读报告 (1).docx b/doc/小米便签开源代码的泛读报告 (1) - 副本.docx similarity index 100% rename from doc/小米便签开源代码的泛读报告 (1).docx rename to doc/小米便签开源代码的泛读报告 (1) - 副本.docx diff --git a/src/Notes-master/.idea/.gitignore b/src/Notes-master/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/src/Notes-master/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/Notes-master/.idea/misc.xml b/src/Notes-master/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/src/Notes-master/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules.xml b/src/Notes-master/.idea/modules.xml new file mode 100644 index 0000000..7800270 --- /dev/null +++ b/src/Notes-master/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/Notes-master.iml b/src/Notes-master/Notes-master.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/src/Notes-master/Notes-master.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index f240604..be9744d 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -18,8 +18,10 @@ package net.micode.notes.data; import android.net.Uri; public class Notes { + /*认证信息和日志输出的标志定义,这里是定义了基本信息,及认证信息和日志输出时的标志,方便我们了解日志信息是由谁发出的。*/ public static final String AUTHORITY = "micode_notes"; public static final String TAG = "Notes"; + /*NoteColumns.TYPE的不同取值,这边定义了note表中,类型行的3种取值*/ public static final int TYPE_NOTE = 0; public static final int TYPE_FOLDER = 1; public static final int TYPE_SYSTEM = 2; @@ -30,11 +32,18 @@ public class Notes { * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records */ + /*这里定义了4种文件夹类型: + ID_ROOT_FOLDER:默认文件夹 + ID_TEMPARAY_FOLDER:不属于文件夹的笔记 + ID_CALL_RECORD_FOLDER:用于存储通话记录,以便返回 + ID_TRASH_FOLER:垃圾回收站*/ public static final int ID_ROOT_FOLDER = 0; public static final int ID_TEMPARAY_FOLDER = -1; public static final int ID_CALL_RECORD_FOLDER = -2; public static final int ID_TRASH_FOLER = -3; +/*额外的数据键定义 +个人理解为就是定义一些布局的ID,这部分就是用于设置UI界面的一些布局或小组件的id。*/ public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; @@ -46,6 +55,8 @@ public class Notes { public static final int TYPE_WIDGET_2X = 0; public static final int TYPE_WIDGET_4X = 1; +/*数据常量的定义 +这里定义了两种数据类型:文本便签和通话记录*/ public static class DataConstants { public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; @@ -54,12 +65,16 @@ public class Notes { /** * Uri to query all notes and folders */ + /* 定义访问笔记、文件和数据的uri +Android开发中常见的用于定义内容提供者(Content Provider)URI,内容提供者是一种Android组件,它允许应用程序共享和存储数据。这里定义了一个URI来查询数据*/ public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); /** * Uri to query data */ public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); +/*NoteColumns接口定义 +这个接口定义了一系列静态的、最终的字符串常量,这些常量代表数据库表中的列名。里面定义的属性有:ID、父级ID、创建日期、修改日期、提醒日期、文件(标签)名(摘要?)、小部件ID、小部件类型、背景颜色ID、附件、文件中的标签数量、 文件(标签)类型、最后一个同步ID、本地修改标签、移动前的ID、谷歌任务ID、代码版本信息。*/ public interface NoteColumns { /** @@ -166,12 +181,14 @@ public class Notes { */ public static final String VERSION = "version"; } - +/*DataColumns的接口定义 +和NoteColumns接口一样,DataColumns的接口,这个接口包含了一系列静态常量,这些常量代表了数据库表中用于存储数据的列名。*/ public interface DataColumns { /** * The unique ID for a row *

Type: INTEGER (long)

*/ + //MIME类型是一种标准,用于标识文档、文件或字节流的性质和格式。在数据库中,这个字段可以用来识别不同类型的数据,例如文本、图片、音频或视频等。 public static final String ID = "_id"; /** @@ -184,24 +201,28 @@ public class Notes { * The reference id to note that this data belongs to *

Type: INTEGER (long)

*/ + //归属的Note的ID public static final String NOTE_ID = "note_id"; /** * Created data for note or folder *

Type: INTEGER (long)

*/ + //创建日期 public static final String CREATED_DATE = "created_date"; /** * Latest modified date *

Type: INTEGER (long)

*/ + //最近修改日期 public static final String MODIFIED_DATE = "modified_date"; /** * Data's content *

Type: TEXT

*/ + //数据内容 public static final String CONTENT = "content"; @@ -210,6 +231,9 @@ public class Notes { * integer data type *

Type: INTEGER

*/ + // 以下5个是通用数据列,它们的具体意义取决于MIME类型(由MIME_TYPE字段指定)。 + // 不同的MIME类型可能需要存储不同类型的数据,这5个字段提供了灵活性,允许根据MIME类型来存储相应的数据。 + // 读后面的代码感觉这部分是在表示内容的不同状态? public static final String DATA1 = "data1"; /** @@ -240,40 +264,46 @@ public class Notes { */ public static final String DATA5 = "data5"; } - +/*DataColumns接口的实现类:TextNote与CallNote +这两个类是上述的DataColumns接口的实现类,分别是文本标签和通话记录实体。定义了实体之后,应用的其他部分或其他应用可以通过内容提供者访问和操作文本标签和通话记录*/ + +//以下是文本便签的定义 public static final class TextNote implements DataColumns { /** * Mode to indicate the text in check list mode or not *

Type: Integer 1:check list mode 0: normal mode

*/ + //模式?这个被存在DATA1列中 public static final String MODE = DATA1; - + //所处检查列表模式? public static final int MODE_CHECK_LIST = 1; - + // 定义了MIME类型,用于标识文本标签的目录 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - +// 定义了MIME类型,用于标识文本标签的单个项 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - +//文本标签内容提供者(Content Provider)的URI,用于访问文本标签数据 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } - +// 通话记录的定义 public static final class CallNote implements DataColumns { /** * Call date for this record *

Type: INTEGER (long)

*/ + //一个字符串常量,表示通话记录的日期 public static final String CALL_DATE = DATA1; /** * Phone number for this record *

Type: TEXT

*/ + //意味着在数据库表中,这个电话号码信息将被存储在DATA3列中 public static final String PHONE_NUMBER = DATA3; - + // 同样定义了MIME类型,是用于标识通话记录的目录。 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - + // 同样定义了MIME类型,是用于标识通话记录的单个项。 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - + //定义了通话记录内容提供者的URI,用于访问通话记录数据。 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); } } diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index ffe5d57..df6747f 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -26,22 +26,27 @@ import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; - +/*部分常量定义 +这里定义的常量分别是数据库名、版本信息、表名、日志标签*/ public class NotesDatabaseHelper extends SQLiteOpenHelper { + // 数据库的基本信息;数据库名称和版本信息(在创建实例对象时会用到) private static final String DB_NAME = "note.db"; - private static final int DB_VERSION = 4; - + //内部接口:个人理解为两个表名,一个note,一个data public interface TABLE { public static final String NOTE = "note"; public static final String DATA = "data"; } - + //一个标签,方便日志输出时识别出信息来自哪里 private static final String TAG = "NotesDatabaseHelper"; - +/*唯一实例的定义 +// 静态所有变量,提供一个全局访问点来获取数据库辅助类的唯一实例,使得在应用的任何地方都可以方便地使用它 */ private static NotesDatabaseHelper mInstance; - +/*创建表和创建索引的SQL语句常量 +这些语句都是为了辅助创建数据库的,在创建数据库时对调用这些创建数据库SQL语句常量,这样写有利于提高代码复用性,以及代码的可维护性。*/ + /* 以下都是一些SQL语句,辅助我们来对数据库进行操作 */ +//创建note表的语句,这里的NoteColumns就是我们刚刚在Notes中定义的一个接口,里面定义了一系列静态的数据库表中的列名 private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -62,7 +67,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + ")"; - +//同上,创建data表的语句,这里的DataColumns就是我们刚刚在Notes中定义的一个接口,里面定义了一系列静态的数据库表中的列名 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + DataColumns.ID + " INTEGER PRIMARY KEY," + @@ -77,7 +82,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + ")"; - +// 功能简介: +// 创建一个以note的ID为索引 +// 解读: +// 用于在TABLE.DATA表上创建一个名为note_id_index的索引。 +// 这个索引是基于DataColumns.NOTE_ID列的。IF NOT EXISTS确保了如果索引已经存在,那么就不会尝试重新创建它,避免了可能的错误。 +// 索引通常用于提高查询性能,特别是在对某个字段进行频繁查询时。 private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; @@ -85,6 +95,15 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Increase folder's note count when move note to the folder */ + /* 增删改的触发器定义常量 +创建数据库时会定义一些触发器,用于根据用户操作时实现对数据库的相应操作,有助于同步数据库信息。*/ + // 功能简介: +// 添加触发器:增加文件夹的便签个数记录(因为我们会移动便签进入文件夹,这时候文件夹的计数要进行更新) +// 解读: +// 定义了一个SQL触发器increase_folder_count_on_update。 +// 触发器是一种特殊的存储过程,它会在指定表上的指定事件(如INSERT、UPDATE、DELETE)发生时自动执行。 +// 这个触发器会在TABLE.NOTE表的NoteColumns.PARENT_ID字段更新后执行。 +// 触发器的逻辑是:当某个笔记的PARENT_ID(即父文件夹ID)被更新时,它会找到对应的文件夹(通过新的PARENT_ID),并将该文件夹的NOTES_COUNT(即笔记数)增加1。 private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update "+ " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + @@ -97,6 +116,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Decrease folder's note count when move note from folder */ + +// 功能简介:(触发器和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) +// 添加触发器:减少文件夹的便签个数记录(因为我们会移动便签移出文件夹,这时候文件夹的计数要进行更新) private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update " + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + @@ -110,6 +132,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Increase folder's note count when insert new note to the folder */ + // 功能简介:(触发器原理和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) +// 添加触发器:当我们在文件夹插入便签时,增加文件夹的便签个数记录 private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert " + " AFTER INSERT ON " + TABLE.NOTE + @@ -122,6 +146,8 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Decrease folder's note count when delete note from the folder */ + // 功能简介:(触发器原理和上面的 “增加文件夹的便签个数记录” 同理,就不细节解读了) +// 添加触发器:当我们在文件夹删除便签时,减少文件夹的便签个数记录 private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete " + " AFTER DELETE ON " + TABLE.NOTE + @@ -135,6 +161,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when insert data with type {@link DataConstants#NOTE} */ + // 功能简介: +// 添加触发器:当向DATA表中插入类型为NOTE(便签)的数据时,更新note表对应的笔记内容。 +// 解读: +// 在DATA表上进行INSERT操作后,如果新插入的数据的MIME_TYPE为NOTE,则触发此操作。 +// 它会更新NOTE表,将与新插入数据相关联的标签的SNIPPET(摘要)字段设置为新插入数据的CONTENT字段的值 private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert " + " AFTER INSERT ON " + TABLE.DATA + @@ -148,6 +179,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has changed */ + // 功能简介: +// 添加触发器:当DATA表中,类型为NOTE(便签)的数据更改时,更新note表对应的笔记内容。 +// 解读: +// 在DATA表上进行UPDATE操作后,如果更新前的数据的MIME_TYPE为NOTE,则触发此操作。 +// 它会更新NOTE表,将与更新后的数据相关联的笔记的SNIPPET字段设置为新数据的CONTENT字段的值 private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + " AFTER UPDATE ON " + TABLE.DATA + @@ -161,6 +197,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted */ + // 功能简介: +// 添加触发器:当DATA表中,类型为NOTE(便签)的数据删除时,更新note表对应的笔记内容(置空)。 +// 解读: +// 在DATA表上进行DELETE操作后,如果删除的数据的MIME_TYPE为NOTE,则触发此操作。 +// 它会更新NOTE表,将与删除的数据相关联的笔记的SNIPPET字段设置为空字符串。 private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete " + " AFTER delete ON " + TABLE.DATA + @@ -174,6 +215,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Delete datas belong to note which has been deleted */ + // 功能简介: +// 添加触发器:当从NOTE表中删除笔记时,删除与该笔记相关联的数据(就是删除data表中为该note的数据) +// 解读: +// 在NOTE表上进行DELETE操作后,此触发器被激活。 +// 它会从DATA表中删除所有与已删除的笔记(由old.ID表示)相关联的数据行(通过比较DATA表中的NOTE_ID字段与已删除笔记的ID来实现) private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete " + " AFTER DELETE ON " + TABLE.NOTE + @@ -185,6 +231,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Delete notes belong to folder which has been deleted */ + // 功能简介: +// 添加触发器:当从NOTE表中删除一个文件夹时,删除该文件夹下的所有笔记。 +// 解读: +// 在NOTE表上进行DELETE操作后,如果删除的是一个文件夹(由old.ID表示) +// 触发器会删除所有以该文件夹为父级(PARENT_ID)的笔记(通过比较NOTE表中的PARENT_ID字段与已删除文件夹的ID来实现) private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete " + " AFTER DELETE ON " + TABLE.NOTE + @@ -196,6 +247,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * Move notes belong to folder which has been moved to trash folder */ + // 功能简介: +// 添加触发器:当某个文件夹被移动到回收站时,移动该文件夹下的所有笔记到回收站 +// 解读: +// 在NOTE表上进行UPDATE操作后,如果某个文件夹的新PARENT_ID字段值等于回收站的ID(Notes.ID_TRASH_FOLER) +// 触发器会更新所有以该文件夹为父级(PARENT_ID)的笔记,将它们也移动到回收站。 + private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash " + " AFTER UPDATE ON " + TABLE.NOTE + @@ -205,7 +262,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " END"; - +/*构造函数 +结合后续的代码看,这两个构造函数是为了实现NotesDatabaseHelper实例的唯一性以及同步性。*/ + +// 创建note(标签)表 public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @@ -216,7 +276,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createSystemFolder(db); Log.d(TAG, "note table has been created"); } - +// 重新创建或更新与笔记表相关的触发器。 +// 首先,使用DROP TRIGGER IF EXISTS语句删除已存在的触发器。确保在重新创建触发器之前,不存在同名的触发器。 +// 然后,使用db.execSQL()方法执行预定义的SQL语句,这些语句用于创建新的触发器。 private void reCreateNoteTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); @@ -234,7 +296,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } - +/*系统文件夹的创建 +4个系统文件夹的创建:标签文件夹、默认文件夹、临时文件夹和回收站。*/ +// 功能简介: +// 创建通话记录文件夹、默认文件夹、临时文件夹和回收站,并插入相关数据 +// 具体解读: +// ContentValues是一个用于存储键值对的类,常用于SQLite数据库的插入操作 +// values.put方法可以向ContentValues对象中添加数据。 +// NoteColumns.ID是存储文件夹ID的列名,Notes.ID_CALL_RECORD_FOLDER是通话记录文件夹的ID。 +// NoteColumns.TYPE是存储文件夹类型的列名,Notes.TYPE_SYSTEM表示这是一个系统文件夹。 +// 使用db.insert方法将values中的数据插入到TABLE.NOTE(即标签表)中。 +// 每次插入新数据前,都使用values.clear()方法清除ContentValues对象中的旧数据,确保不会重复插入旧数据。 +// 然后分别创建默认文件夹、临时文件夹和回收站,并以同样的方法插入数据。 private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); @@ -248,6 +321,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * root folder which is default folder */ + // 创建默认文件夹:重复上述步骤,但这次是为根文件夹插入数据。 values.clear(); values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); @@ -256,6 +330,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * temporary folder which is used for moving note */ + // 创建“临时”文件夹:同样地,为临时文件夹插入数据。 values.clear(); values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); @@ -264,12 +339,21 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { /** * create trash folder */ + // 创建“回收站”文件夹:最后,为回收站文件夹插入数据。 values.clear(); values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); } - +//data表的创建 +//功能简介: +//创建data(数据)表 +//解读: +//这个方法用于创建数据表,以及与之相关的触发器。 +//创建数据表:使用db.execSQL方法执行预定义的SQL语句CREATE_DATA_TABLE_SQL,用于创建数据表。 +//重新创建数据表触发器:调用reCreateDataTableTriggers方法,用于删除并重新创建与数据表相关的触发器。 +//创建索引:使用db.execSQL方法执行CREATE_DATA_NOTE_ID_INDEX_SQL语句,为数据表创建索引。 +//记录日志:使用Log.d方法记录一条调试级别的日志,表示数据表已经创建。 public void createDataTable(SQLiteDatabase db) { db.execSQL(CREATE_DATA_TABLE_SQL); reCreateDataTableTriggers(db); @@ -277,6 +361,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { Log.d(TAG, "data table has been created"); } +//和上面的note表的reCreate...同理 +//重新创建或更新与笔记表相关的触发器。 +//首先,使用DROP TRIGGER IF EXISTS语句删除已存在的触发器。确保在重新创建触发器之前,不存在同名的触发器。 +//然后,使用db.execSQL()方法执行预定义的SQL语句,这些语句用于创建新的触发器。 private void reCreateDataTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); @@ -295,12 +383,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { } @Override + public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } @Override + /*数据库版本更新 +主要是涉及数据库升级时,需要对表的修改操作。*/ +//功能简介: +//当数据库需要升级时(即数据库的版本号改变),onUpgrade方法会被调用。 +//该方法会根据当前的oldVersion和新的newVersion来执行相应的升级操作 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; boolean skipV2 = false; @@ -327,12 +421,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { reCreateDataTableTriggers(db); } - if (oldVersion != newVersion) { + if (oldVersion != newVersion) {//数据库升级失败,抛出一个异常,表示数据库升级失败 throw new IllegalStateException("Upgrade notes database to version " + newVersion + "fails"); } } +//数据库版本升级具体实现 +//功能简介: +// 将数据库从版本1升级到版本2。 +//解读: +// 首先,它删除了已经存在的NOTE和DATA表(如果存在的话)。DROP TABLE IF EXISTS语句确保了即使这些表不存在,也不会抛出错误。 +// 然后,它调用了createNoteTable(db)和createDataTable(db)方法来重新创建这两个表。这意味着在升级到版本2时,这两个表的内容会被完全清除,并重新创建新的空表。 private void upgradeToV2(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); @@ -340,6 +440,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createDataTable(db); } +//功能简介: +// 将数据库从版本2(或可能是跳过版本2的某个状态)升级到版本3。 +//解读: +// 首先,删除了三个不再使用的触发器(如果存在的话)。触发器是数据库中的一种对象,可以在插入、更新或删除记录时自动执行某些操作。 +// 然后,使用ALTER TABLE语句修改表结构,向NOTE表中添加了一个名为GTASK_ID的新列,并设置默认值为空字符串。 +// 最后,向NOTE表中插入了一条新的系统文件夹记录,表示一个名为“trash folder”的系统文件夹。这可能是用于存储已删除笔记的回收站功能。 + private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); @@ -354,7 +461,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); } - +//功能简介: +// 这个方法负责将数据库从版本3升级到版本4。 +//解读: +// 它向NOTE表中添加了一个名为VERSION的新列,并设置了默认值为0。这个新列用于记录标签版本信息。 private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java index 4f3e688..3a2050b 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java @@ -26,58 +26,29 @@ import org.json.JSONObject; public class MetaData extends Task { - /* - - * 功能描述:得到类的简写名称存入字符串TAG中 - - * 实现过程:调用getSimpleName ()函数 - */ - private final static String TAG = MetaData.class.getSimpleName(); private String mRelatedGid = null; - /* - * 功能描述:设置数据,即生成元数据库 - * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 - * 参数注解: - */ - public void setMeta(String gid, JSONObject metaInfo) - { - //对函数块进行注释 + public void setMeta(String gid, JSONObject metaInfo) { try { metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); - /* - * 将这对键值放入metaInfo这个jsonobject对象中 - */ } catch (JSONException e) { Log.e(TAG, "failed to put related gid"); - /* - * 输出错误信息 - */ } setNotes(metaInfo.toString()); setName(GTaskStringUtils.META_NOTE_NAME); } - /* - * 功能描述:获取相关联的Gid - */ + public String getRelatedGid() { return mRelatedGid; } - /* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 - */ @Override public boolean isWorthSaving() { return getNotes() != null; } - /* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: - */ + @Override public void setContentByRemoteJSON(JSONObject js) { super.setContentByRemoteJSON(js); @@ -87,50 +58,25 @@ public class MetaData extends Task { mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); } catch (JSONException e) { Log.w(TAG, "failed to get related gid"); - /* - * 输出警告信息 - */ mRelatedGid = null; } } } - /* - * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 - - */ @Override public void setContentByLocalJSON(JSONObject js) { // this function should not be called throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - - /* - * 传递非法参数异常 - */ } - /* - * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 - */ - @Override public JSONObject getLocalJSONFromContent() { throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ } - /* - * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 - * Made By CuiCan - */ + @Override public int getSyncAction(Cursor c) { throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - /* - * 传递非法参数异常 - * Made By Cui Can - */ } - + +} diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java index 93b94a7..63950e0 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java @@ -19,38 +19,33 @@ package net.micode.notes.gtask.data; import android.database.Cursor; import org.json.JSONObject; -/** - * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 - * 关键字:abstract - */ - public abstract class Node { - //定义了各种用于表征同步状态的常量 - public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) - - public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 - - public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 - - public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 - - public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 - - public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 - - public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 - - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 - - public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 - +public abstract class Node { + public static final int SYNC_ACTION_NONE = 0; + + public static final int SYNC_ACTION_ADD_REMOTE = 1; + + public static final int SYNC_ACTION_ADD_LOCAL = 2; + + public static final int SYNC_ACTION_DEL_REMOTE = 3; + + public static final int SYNC_ACTION_DEL_LOCAL = 4; + + public static final int SYNC_ACTION_UPDATE_REMOTE = 5; + + public static final int SYNC_ACTION_UPDATE_LOCAL = 6; + + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; + + public static final int SYNC_ACTION_ERROR = 8; + private String mGid; - + private String mName; - - private long mLastModified;//记录最后一次修改时间 - - private boolean mDeleted;//表征是否被删除 + + private long mLastModified; + + private boolean mDeleted; public Node() { mGid = null; diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java index f8f7c2a..d3ec3be 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java @@ -14,57 +14,48 @@ * limitations under the License. */ +package net.micode.notes.gtask.data; + +import android.content.ContentResolver; +import android.content.ContentUris; +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.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; +import net.micode.notes.gtask.exception.ActionFailureException; + +import org.json.JSONException; +import org.json.JSONObject; - /* - * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 - * SqlData其实就是也就是所谓数据中的数据 - */ - -package net.micode.notes.gtask.data; -/* - * 功能描述: - * 实现过程: - * 参数注解: - */ - public class SqlData { - /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 - - */ private static final String TAG = SqlData.class.getSimpleName(); - -private static final int INVALID_ID = -99999; -=为mDataId置初始值-99999 - - - /** - * 来自Notes类中定义的DataColumn中的一些常量 - */ - - // 集合了interface DataColumns中所有SF常量 + + private static final int INVALID_ID = -99999; + public static final String[] PROJECTION_DATA = new String[] { DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, DataColumns.DATA3 }; - - /** - * 以下五个变量作为sql表中5列的编号 - */ + public static final int DATA_ID_COLUMN = 0; - + public static final int DATA_MIME_TYPE_COLUMN = 1; - + public static final int DATA_CONTENT_COLUMN = 2; - + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - + private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false private boolean mIsCreate; @@ -79,19 +70,11 @@ private static final int INVALID_ID = -99999; private String mDataContentData3; private ContentValues mDiffDataValues; - /* - * 功能描述:构造函数,用于初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - * Made By CuiCan - */ public SqlData(Context context) { mContentResolver = context.getContentResolver(); mIsCreate = true; - mDataId = INVALID_ID;//mDataId置初始值-99999 - + mDataId = INVALID_ID; mDataMimeType = DataConstants.NOTE; mDataContent = ""; mDataContentData1 = 0; @@ -99,23 +82,13 @@ private static final int INVALID_ID = -99999; mDiffDataValues = new ContentValues(); } - /* - * 功能描述:构造函数,初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: - */ public SqlData(Context context, Cursor c) { mContentResolver = context.getContentResolver(); mIsCreate = false; loadFromCursor(c); mDiffDataValues = new ContentValues(); } - - /* - * 功能描述:从光标处加载数据 - * 从当前的光标处将五列的数据加载到该类的对象 - */ + private void loadFromCursor(Cursor c) { mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); @@ -123,27 +96,21 @@ private static final int INVALID_ID = -99999; mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - - - /* - * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 - * 参数注解: - */ + public void setContent(JSONObject js) throws JSONException { - //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; - + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) : DataConstants.NOTE; if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); } mDataMimeType = dataMimeType; - + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; if (mIsCreate || !mDataContent.equals(dataContent)) { mDiffDataValues.put(DataColumns.CONTENT, dataContent); @@ -163,19 +130,11 @@ private static final int INVALID_ID = -99999; mDataContentData3 = dataContentData3; } - - - /* - * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 - * 参数注解: - * Made By CuiCan - */ public JSONObject getContent() throws JSONException { if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } - //创建JSONObject对象。并将相关数据放入其中,并返回。 JSONObject js = new JSONObject(); js.put(DataColumns.ID, mDataId); js.put(DataColumns.MIME_TYPE, mDataMimeType); @@ -184,11 +143,7 @@ private static final int INVALID_ID = -99999; js.put(DataColumns.DATA3, mDataContentData3); return js; } - - /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - */ - + public void commit(long noteId, boolean validateVersion, long version) { if (mIsCreate) { @@ -228,12 +183,6 @@ private static final int INVALID_ID = -99999; mIsCreate = false; } - /* - * 功能描述:获取当前id - * 实现过程: - * 参数注解: - */ - public long getId() { return mDataId; } diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java index 2adf26b..79a4095 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java @@ -14,9 +14,6 @@ * limitations under the License. */ - - - package net.micode.notes.gtask.data; import android.appwidget.AppWidgetManager; diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java index 64aacd0..6a19454 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java @@ -35,25 +35,25 @@ import org.json.JSONObject; public class Task extends Node { private static final String TAG = Task.class.getSimpleName(); - private boolean mCompleted;//是否完成 - + private boolean mCompleted; + private String mNotes; - - private JSONObject mMetaInfo;//将在实例中存储数据的类型 - - private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) - - private TaskList mParent;//所在的任务列表的指针 - + + private JSONObject mMetaInfo; + + private Task mPriorSibling; + + private TaskList mParent; + public Task() { super(); mCompleted = false; mNotes = null; - mPriorSibling = null;//TaskList中当前Task前面的Task的指针 - mParent = null;//当前Task所在的TaskList + mPriorSibling = null; + mParent = null; mMetaInfo = null; } - + public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java index fe77c6f..4ea21c5 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java @@ -42,10 +42,6 @@ public class TaskList extends Node { mChildren = new ArrayList(); mIndex = 1; } - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getCreateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); @@ -77,10 +73,6 @@ public class TaskList extends Node { return js; } - /* (non-Javadoc) - * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 - */ public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); @@ -224,20 +216,6 @@ public class TaskList extends Node { return SYNC_ACTION_ERROR; } - /** - * @return - * 功能:获得TaskList的大小,即mChildren的大小 - */ - public int getChildTaskCount() { - return mChildren.size(); - } - - /** - * @param task - * @return 返回值为是否成功添加任务。 - * 功能:在当前任务表末尾添加新的任务。 - */ - public int getChildTaskCount() { return mChildren.size(); } @@ -251,13 +229,10 @@ public class TaskList extends Node { task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); task.setParent(this); - //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 - //,接下来几个函数都有相关操作 } } return ret; } - //功能:在当前任务表的指定位置添加新的任务。 public boolean addChildTask(Task task, int index) { if (index < 0 || index > mChildren.size()) { @@ -284,11 +259,6 @@ public class TaskList extends Node { return true; } - /** - * @param task - * @return 返回删除是否成功 - * 功能:删除TaskList中的一个Task - */ public boolean removeChildTask(Task task) { boolean ret = false; @@ -310,7 +280,6 @@ public class TaskList extends Node { } return ret; } - // 功能:将当前TaskList中含有的某个Task移到index位置 public boolean moveChildTask(Task task, int index) { @@ -329,11 +298,6 @@ public class TaskList extends Node { return true; return (removeChildTask(task) && addChildTask(task, index)); } - //利用已实现好的功能完成当下功能; - - - - // 功能:按gid寻找Task public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { @@ -344,18 +308,11 @@ public class TaskList extends Node { } return null; } - // 功能:按gid寻找Task - - //功能:返回指定Task的index - 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"); @@ -363,7 +320,6 @@ public class TaskList extends Node { } return mChildren.get(index); } - // 功能:返回指定gid的Task public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { diff --git a/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java b/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java index 706732f..15504be 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java +++ b/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java @@ -14,32 +14,15 @@ * limitations under the License. */ - - -/* - * Description:支持小米便签运行过程中的运行异常处理。 - */ - package net.micode.notes.gtask.exception; - + public class ActionFailureException extends RuntimeException { private static final long serialVersionUID = 4425249765923293627L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - + public ActionFailureException() { super(); } - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ + public ActionFailureException(String paramString) { super(paramString); } diff --git a/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java index a0a2409..b08cfb1 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java +++ b/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -14,33 +14,14 @@ * limitations under the License. */ - - -/* - * Description:支持小米便签运行过程中的网络异常处理。 - */ - package net.micode.notes.gtask.exception; - + public class NetworkFailureException extends Exception { private static final long serialVersionUID = 2107610287180234136L; - /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 - * Made By Cuican - */ - + public NetworkFailureException() { super(); } - - /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) - * Made By Cuican - */ public NetworkFailureException(String paramString) { super(paramString); diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java index ebd200c..b3b61e7 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -28,14 +28,6 @@ import net.micode.notes.R; import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesPreferenceActivity; -/*异步操作类,实现GTask的异步操作过程 - * 主要方法: - * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 - * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 - * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 - * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI - */ - public class GTaskASyncTask extends AsyncTask { @@ -65,7 +57,7 @@ public class GTaskASyncTask extends AsyncTask { mTaskManager.cancelSync(); } - public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + public void publishProgess(String message) { publishProgress(new String[] { message }); @@ -74,46 +66,43 @@ public class GTaskASyncTask extends AsyncTask { private void showNotification(int tickerId, String content) { Notification notification = new Notification(R.drawable.notification, mContext .getString(tickerId), System.currentTimeMillis()); - - notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光 - notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失 - PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 + notification.defaults = Notification.DEFAULT_LIGHTS; + notification.flags = Notification.FLAG_AUTO_CANCEL; + PendingIntent pendingIntent; if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 - + NotesPreferenceActivity.class), 0); + } else { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), 0); -//如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 + NotesListActivity.class), 0); } notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); } - + @Override protected Integer doInBackground(Void... unused) { publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 - return mTaskManager.sync(mContext, this); //进行后台同步具体操作 + .getSyncAccountName(mContext))); + return mTaskManager.sync(mContext, this); } - + @Override protected void onProgressUpdate(String... progress) { showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 + if (mContext instanceof GTaskSyncService) { ((GTaskSyncService) mContext).sendBroadcast(progress[0]); } } @Override - protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 - + protected void onPostExecute(Integer result) { if (result == GTaskManager.STATE_SUCCESS) { showNotification(R.string.ticker_success, mContext.getString( R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());//设置最新同步的时间 + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); } else if (result == GTaskManager.STATE_NETWORK_ERROR) { showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { @@ -122,13 +111,10 @@ public class GTaskASyncTask extends AsyncTask { showNotification(R.string.ticker_cancel, mContext .getString(R.string.error_sync_cancelled)); } - //几种不同情况下的结果显示 if (mOnCompleteListener != null) { - new Thread(new Runnable() { - //这里好像是方法内的一个线程,但是并不太懂什么意思 - - public void run() { - //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 + new Thread(new Runnable() { + + public void run() { mOnCompleteListener.onComplete(); } }).start(); diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java index 9bac347..c67dfdf 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java @@ -61,13 +61,10 @@ import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; - //主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 - //主要使用类或技术:accountManager JSONObject HttpParams authToken Gid - public class GTaskClient { private static final String TAG = GTaskClient.class.getSimpleName(); - private static final String GTASK_URL = "https://mail.google.com/tasks/";//这是一个指定的URL + private static final String GTASK_URL = "https://mail.google.com/tasks/"; private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; @@ -104,10 +101,6 @@ public class GTaskClient { mAccount = null; mUpdateArray = null; } - /*用来获取的实例化对象 - * 使用 getInstance() - * 返回mInstance这个实例化对象 - */ public static synchronized GTaskClient getInstance() { if (mInstance == null) { @@ -115,15 +108,8 @@ public class GTaskClient { } return mInstance; } - /*用来实现登录操作的函数,传入的参数是一个Activity - * 设置登录操作限制时间,如果超时则需要重新登录 - * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 - * 返回true或者false,即最后是否登陆成功 - */ public boolean login(Activity activity) { - //判断距离最后一次登录操作是否超过5分钟 - // we suppose that the cookie would expire after 5 minutes // then we need to re-login final long interval = 1000 * 60 * 5; @@ -131,23 +117,20 @@ public class GTaskClient { mLoggedin = false; } - // need to re-login after account switch 重新登陆操作 + // need to re-login after account switch if (mLoggedin && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity .getSyncAccountName(activity))) { mLoggedin = false; } - //如果没超过时间,则不需要重新登录 if (mLoggedin) { Log.d(TAG, "already logged in"); return true; } - + mLastLoginTime = System.currentTimeMillis(); - //更新最后登录时间,改为系统当前的时间 String authToken = loginGoogleAccount(activity, false); - //判断是否登录到谷歌账户 if (authToken == null) { Log.e(TAG, "login google account failed"); return false;