diff --git a/doc/readme.md b/doc/readme.md deleted file mode 100644 index e69de29..0000000 diff --git a/doc/李豪杰显示结果.jpg b/doc/李豪杰显示结果.jpg new file mode 100644 index 0000000..c146057 Binary files /dev/null and b/doc/李豪杰显示结果.jpg differ diff --git a/doc/李豪杰的泛读报告.docx b/doc/李豪杰的泛读报告.docx new file mode 100644 index 0000000..dc2ba68 Binary files /dev/null and b/doc/李豪杰的泛读报告.docx differ diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/data/Contact.java b/src/Notesmaster/app/src/main/java/net/micode/notes/data/Contact.java index d97ac5d..e219f67 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/data/Contact.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/data/Contact.java @@ -26,9 +26,12 @@ import android.util.Log; import java.util.HashMap; public class Contact { + // һ̬HashMapڻϵϢ private static HashMap sContactCache; + // һַ̬ڱ־Ϣ private static final String TAG = "Contact"; + // һַ̬ڲѯϵϢSQL private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + " AND " + Data.RAW_CONTACT_ID + " IN " @@ -36,38 +39,65 @@ public class Contact { + " FROM phone_lookup" + " WHERE min_match = '+')"; + // ݵ绰ȡϵϢ public static String getContact(Context context, String phoneNumber) { + // Ϊգ򴴽һµHashMap +public class Contact { + +// ݵ绰ȡϵ + public String getContactName(String phoneNumber) { + // ϵ˻Ϊգ򴴽һµHashMap if(sContactCache == null) { sContactCache = new HashMap(); } - + + // Ѿڸõ绰ϵϢֱӷ if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } - + + +// phoneNumberתΪCallerIDMinMatchʽ滻CALLER_ID_SELECTIONַ String selection = CALLER_ID_SELECTION.replace("+", PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // ִвѯ +// ݵ绰ѯϵ +// ȡContentResolver Cursor cursor = context.getContentResolver().query( + // ѯURI Data.CONTENT_URI, + // ѯ new String [] { Phone.DISPLAY_NAME }, + // ѯ selection, + // ѯIJ new String[] { phoneNumber }, + // null); - + + // ѯΪαָһ if (cursor != null && cursor.moveToFirst()) { try { + // ȡϵ String name = cursor.getString(0); + // 绰ϵ뻺 sContactCache.put(phoneNumber, name); + // ϵ return name; } catch (IndexOutOfBoundsException e) { + // ȡϵӡ־ Log.e(TAG, " Cursor get string error " + e.toString()); + // null return null; } finally { + // رα cursor.close(); } } else { + // ûƥϵˣӡ־ Log.d(TAG, "No contact matched with number:" + phoneNumber); + // null return null; } } -} +} \ No newline at end of file diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/data/Notes.java b/src/Notesmaster/app/src/main/java/net/micode/notes/data/Notes.java index f240604..f28f07a 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/data/Notes.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/data/Notes.java @@ -18,262 +18,242 @@ package net.micode.notes.data; import android.net.Uri; public class Notes { + // Notesij + // һʾNotesȨ public static final String AUTHORITY = "micode_notes"; + // һʾNotesıǩ public static final String TAG = "Notes"; + // һʾNotesΪNote public static final int TYPE_NOTE = 0; + // һʾNotesΪFolder public static final int TYPE_FOLDER = 1; + // һʾNotesΪSystem public static final int TYPE_SYSTEM = 2; - /** - * Following IDs are system folders' identifiers - * {@link Notes#ID_ROOT_FOLDER } is default folder - * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder - * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records - */ + + // ļеID public static final int ID_ROOT_FOLDER = 0; + // ʱļеID public static final int ID_TEMPARAY_FOLDER = -1; + // ͨ¼ļеID public static final int ID_CALL_RECORD_FOLDER = -2; + // վID public static final int ID_TRASH_FOLER = -3; + // IntentĶ +// һʾڵͼ 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"; +// һʾС͵ͼ public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; +// һʾļеͼ public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; +// һʾͨڵͼ public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; - public static final int TYPE_WIDGET_INVALIDE = -1; - public static final int TYPE_WIDGET_2X = 0; - public static final int TYPE_WIDGET_4X = 1; + // С + public static final int TYPE_WIDGET_INVALIDE = -1; // Чwidget + public static final int TYPE_WIDGET_2X = 0; // 2xwidget + public static final int TYPE_WIDGET_4X = 1; // 4xwidget public static class DataConstants { - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // ıʼǵcontent type + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // бʼǵcontent type } - /** - * Uri to query all notes and folders - */ - public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); + +// һʾnoteUri + 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"); + + // һʾݵURI + public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + // һӿڣڶNote public interface NoteColumns { - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ + + // һʾID public static final String ID = "_id"; - /** - * The parent's id for note or folder - *

Type: INTEGER (long)

- */ + + + // һʾڵID public static final String PARENT_ID = "parent_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"; - /** - * Alert date - *

Type: INTEGER (long)

- */ + + + // һڴ洢 public static final String ALERTED_DATE = "alert_date"; - /** - * Folder's name or text content of note - *

Type: TEXT

- */ + + +// һڱʾƬ public static final String SNIPPET = "snippet"; - /** - * Note's widget id - *

Type: INTEGER (long)

- */ + + +// һʾСID public static final String WIDGET_ID = "widget_id"; - /** - * Note's widget type - *

Type: INTEGER (long)

- */ + + +// һʾС public static final String WIDGET_TYPE = "widget_type"; - /** - * Note's background color's id - *

Type: INTEGER (long)

- */ + + + // һʾɫID public static final String BG_COLOR_ID = "bg_color_id"; - /** - * For text note, it doesn't has attachment, for multi-media - * note, it has at least one attachment - *

Type: INTEGER

- */ + + // NoteеǷиֶ + // һʾǷи public static final String HAS_ATTACHMENT = "has_attachment"; - /** - * Folder's count of notes - *

Type: INTEGER (long)

- */ + + // Noteеıʼֶ +// һڴ洢ʼ public static final String NOTES_COUNT = "notes_count"; - /** - * The file type: folder or note - *

Type: INTEGER

- */ + + // Noteеֶ + // һʾ public static final String TYPE = "type"; - /** - * The last sync id - *

Type: INTEGER (long)

- */ + + // NoteеͬIDֶ +// һͬID public static final String SYNC_ID = "sync_id"; - /** - * Sign to indicate local modified or not - *

Type: INTEGER

- */ + + // Noteеı޸ֶ +// һʾ޸ public static final String LOCAL_MODIFIED = "local_modified"; - /** - * Original parent id before moving into temporary folder - *

Type : INTEGER

- */ + + // NoteеԭʼIDֶ +// һʾԭʼID public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - /** - * The gtask id - *

Type : TEXT

- */ + + // NoteеGTask IDֶ +// һڴ洢ID public static final String GTASK_ID = "gtask_id"; - /** - * The version code - *

Type : INTEGER (long)

- */ + + // Noteеİ汾ֶ + // һʾ汾 public static final String VERSION = "version"; } public interface DataColumns { - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ + + // DataеIDֶ + // һʾID public static final String ID = "_id"; - /** - * The MIME type of the item represented by this row. - *

Type: Text

- */ + + // DataеMIMEֶ +// һʾMIME public static final String MIME_TYPE = "mime_type"; - /** - * The reference id to note that this data belongs to - *

Type: INTEGER (long)

- */ + + // DataеNote IDֶ +// һڱʾʼǵID public static final String NOTE_ID = "note_id"; - /** - * Created data for note or folder - *

Type: INTEGER (long)

- */ + + // DataеĴֶ +// һʾ public static final String CREATED_DATE = "created_date"; - /** - * Latest modified date - *

Type: INTEGER (long)

- */ + + // Dataе޸ֶ +// һʾ޸ public static final String MODIFIED_DATE = "modified_date"; - /** - * Data's content - *

Type: TEXT

- */ + + // Dataеֶ +// һCONTENTֵΪ"content" public static final String CONTENT = "content"; - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA1 = "data1"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA2 = "data2"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA3 = "data3"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA4 = "data4"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA5 = "data5"; + +// һDATA1ֵΪ"data1" + public static final String DATA1 = "data1"; + + + public static final String DATA2 = "data2"; // һDATA2ֵΪ"data2" + + + public static final String DATA3 = "data3"; // һDATA3ֵΪ"data3" + + + public static final String DATA4 = "data4"; // һDATA4ֵΪ"data4" + + + public static final String DATA5 = "data5"; // һDATA5ֵΪ"data5" } +// һΪTextNoteĹ̬࣬ʵ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

- */ + + // ıʼģʽ +// һMODEֵΪDATA1 public static final String MODE = DATA1; + // бģʽ +// һʾбģʽ public static final int MODE_CHECK_LIST = 1; + // ıʼ +// һʾΪ"text_note" public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; + // ıʼ + // һʾıʼǵContentItemType public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; + // ıʼURI + // һUriڷtext_note public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } +// һΪCallNoteĹ̬࣬ʵDataColumnsӿ public static final class CallNote implements DataColumns { - /** - * Call date for this record - *

Type: INTEGER (long)

- */ + + // ͨ + // һCALL_DATEֵΪDATA1 public static final String CALL_DATE = DATA1; - /** - * Phone number for this record - *

Type: TEXT

- */ + + // 绰 +// һPHONE_NUMBERֵΪDATA3 public static final String PHONE_NUMBER = DATA3; + // ͨʼ + // һʾΪcall_note public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; + // ͨʼ +// һʾΪcall_note public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; + // ͨʼURI +// һUriڷCallNoteProviderе public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); } } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java index ffe5d57..b5fb389 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -28,75 +28,117 @@ 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; public interface TABLE { +// һNOTEֵΪ"note" public static final String NOTE = "note"; +// һDATAֵΪ"data" public static final String DATA = "data"; } +// һڱʶNotesDatabaseHelper private static final String TAG = "NotesDatabaseHelper"; +// һ̬NotesDatabaseHelper͵ımInstance private static NotesDatabaseHelper mInstance; + // 崴ʼDZSQL private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + + // һΪNoteı NoteColumns.ID + " INTEGER PRIMARY KEY," + + // һΪIDУΪINTEGERΪ NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + + // һΪPARENT_IDУΪINTEGERĬֵΪ0 NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + + // һΪALERTED_DATEУΪINTEGERĬֵΪ0 NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + + // һΪBG_COLOR_IDУΪINTEGERĬֵΪ0 NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + // һΪCREATED_DATEУΪINTEGERĬֵΪǰʱ NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + + // һΪHAS_ATTACHMENTУΪINTEGERĬֵΪ0 NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + // һΪMODIFIED_DATEУΪINTEGERĬֵΪǰʱ NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + + // һΪNOTES_COUNTУΪINTEGERĬֵΪ0 NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + + // һΪSNIPPETУΪTEXTĬֵΪַ NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + + // һΪTYPEУΪINTEGERĬֵΪ0 NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + + // һΪWIDGET_IDУΪINTEGERĬֵΪ0 NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + + // һΪWIDGET_TYPEУΪINTEGERĬֵΪ-1 NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + + // һΪSYNC_IDУΪINTEGERĬֵΪ0 NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + + // һΪLOCAL_MODIFIEDУΪINTEGERĬֵΪ0 NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + + // һΪORIGIN_PARENT_IDУΪINTEGERĬֵΪ0 NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + + // һΪGTASK_IDУΪTEXTĬֵΪַ NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + + // һΪVERSIONУΪINTEGERĬֵΪ0 ")"; +// һڴݱSQL private static final String CREATE_DATA_TABLE_SQL = +// һΪTABLE.DATAıУ "CREATE TABLE " + TABLE.DATA + "(" + + // IDУΪINTEGERΪ DataColumns.ID + " INTEGER PRIMARY KEY," + + // MIME_TYPEУΪTEXTΪ DataColumns.MIME_TYPE + " TEXT NOT NULL," + + // NOTE_IDУΪINTEGERΪգĬֵΪ0 DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + + // CREATED_DATEУΪINTEGERΪգĬֵΪǰʱ NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + // MODIFIED_DATEУΪINTEGERΪգĬֵΪǰʱ NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + // CONTENTУΪTEXTΪգĬֵΪַ DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + + // DATA1УΪINTEGER DataColumns.DATA1 + " INTEGER," + + // DATA2УΪINTEGER DataColumns.DATA2 + " INTEGER," + + // DATA3УΪTEXTΪգĬֵΪַ DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + + // DATA4УΪTEXTΪգĬֵΪַ DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + + // DATA5УΪTEXTΪգĬֵΪַ DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + + // ")"; +// һڴSQL private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = +// һΪnote_id_index "CREATE INDEX IF NOT EXISTS note_id_index ON " + +// ѯTABLENOTE_IDе TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; - /** - * Increase folder's note count when move note to the folder - */ + + // һ̬ڸʱļĴ 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 + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * Decrease folder's note count when move note from folder - */ + "CREATE TRIGGER increase_folder_count_on_update "+ // һڸNotePARENT_IDֶκӶӦļеNOTES_COUNTֶ + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + // NotePARENT_IDֶθº󴥷 + " BEGIN " + // ʼ + " UPDATE " + TABLE.NOTE + // Note + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + // NOTES_COUNTֶμ1 + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + // IDֶεֵ + " END"; // + + +// һڱʾڸ´мļIJ +// һΪdecrease_folder_count_on_updateĴڸNoteparent_idֶκִ 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 + @@ -107,255 +149,327 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + " END"; - /** - * 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 + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - - /** - * Decrease folder's note count when delete note from the folder - */ + "CREATE TRIGGER increase_folder_count_on_insert " + // һΪincrease_folder_count_on_insert + " AFTER INSERT ON " + TABLE.NOTE + // NOTEϲݺ󴥷 + " BEGIN " + // ʼ + " UPDATE " + TABLE.NOTE + // NOTE + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + // NOTES_COUNTֶμ1 + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + // ΪID²ݵPARENT_ID + " END"; // + + + // һɾļʱļĴ private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = - "CREATE TRIGGER decrease_folder_count_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END"; - - /** - * Update note's content when insert data with type {@link DataConstants#NOTE} - */ + "CREATE TRIGGER decrease_folder_count_on_delete " + // һɾʼǺļеıʼ + " AFTER DELETE ON " + TABLE.NOTE + // ɾʼǺ󴥷 + " BEGIN " + // ʼ + " UPDATE " + TABLE.NOTE + // ±ʼDZ + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + // ʼ1 + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + // ڸļIDڱɾʼǵĸļID + " AND " + NoteColumns.NOTES_COUNT + ">0;" + // ʼ0 + " END"; // + + + // һڴ洢ڲʱ±עݵĴ private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = - "CREATE TRIGGER update_note_content_on_insert " + - " AFTER INSERT ON " + TABLE.DATA + - " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has changed - */ + "CREATE TRIGGER update_note_content_on_insert " + // һΪupdate_note_content_on_insert + " AFTER INSERT ON " + TABLE.DATA + // ڲݱ󴥷 + " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + // ²ݵMIME_TYPEΪNOTEʱ + " BEGIN" + // ʼ + " UPDATE " + TABLE.NOTE + // NOTE + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + // ²ݵCONTENTֵNOTESNIPPET + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + // NOTEID²ݵNOTE_IDƥ + " END"; // + + +// һڸ´ʱע͵ private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + - " AFTER UPDATE ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " AFTER UPDATE ON " + TABLE.DATA + // һڸDATAִ + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + // ݵMIME_TYPEΪNOTEʱ " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + + " UPDATE " + TABLE.NOTE + // NOTE + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + // ݵCONTENTֵNOTESNIPPET + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + // NOTEУIDݵNOTE_ID " END"; - /** - * Update note's content when data with {@link DataConstants#NOTE} type has deleted - */ + + // һڴ洢ɾʱע͵ private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = - "CREATE TRIGGER update_note_content_on_delete " + - " AFTER delete ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=''" + - " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END"; - - /** - * Delete datas belong to note which has been deleted - */ + "CREATE TRIGGER update_note_content_on_delete " + // һΪupdate_note_content_on_delete + " AFTER delete ON " + TABLE.DATA + // ɾݱ󴥷 + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + // ɾݵMIME_TYPEΪNOTEʱ + " BEGIN" + // ʼ + " UPDATE " + TABLE.NOTE + // NOTE + " SET " + NoteColumns.SNIPPET + "=''" + // SNIPPETֶΪַ + " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + // NOTEУIDɾݵNOTE_ID + " END"; // + + +// һɾʱɾ private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = - "CREATE TRIGGER delete_data_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.DATA + - " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * Delete notes belong to folder which has been deleted - */ + "CREATE TRIGGER delete_data_on_delete " + // һΪdelete_data_on_delete + " AFTER DELETE ON " + TABLE.NOTE + // ɾNOTEеݺ󴥷 + " BEGIN" + // ʼ + " DELETE FROM " + TABLE.DATA + // DATAɾ + " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + // ΪNOTE_IDڱɾNOTEID + " END"; // + + + // һɾļʱɾʼǵĴ private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = - "CREATE TRIGGER folder_delete_notes_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.NOTE + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - - /** - * Move notes belong to folder which has been moved to trash folder - */ + "CREATE TRIGGER folder_delete_notes_on_delete " + // һΪfolder_delete_notes_on_delete + " AFTER DELETE ON " + TABLE.NOTE + // ɾNOTEеݺ󴥷 + " BEGIN" + // ʼ + " DELETE FROM " + TABLE.NOTE + // NOTEɾ + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + // ɾΪPARENT_IDڱɾݵID + " END"; // + + +// һڱʾڻվƶļļʱʾϢ private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = - "CREATE TRIGGER folder_move_notes_on_trash " + - " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END"; - + "CREATE TRIGGER folder_move_notes_on_trash " + // һΪfolder_move_notes_on_trashĴ + " AFTER UPDATE ON " + TABLE.NOTE + // NOTEִи²󴥷 + " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + // ¼¼ĸIDͰļIDʱ + " BEGIN" + // ʼִд + " UPDATE " + TABLE.NOTE + // NOTE + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + // IDΪͰļID + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + // ڸIDھɼ¼ID + " END"; // + +// 캯ڳʼNotesDatabaseHelper public NotesDatabaseHelper(Context context) { + // øĹ캯ġݿơα깤ݿ汾 super(context, DB_NAME, null, DB_VERSION); } public void createNoteTable(SQLiteDatabase db) { + // ִдnoteSQL db.execSQL(CREATE_NOTE_TABLE_SQL); + // ´noteĴ reCreateNoteTableTriggers(db); + // ϵͳļ createSystemFolder(db); + // ӡ־noteѴ Log.d(TAG, "note table has been created"); } +// ´ʼDZ private void reCreateNoteTableTriggers(SQLiteDatabase db) { + // ɾд +// ɾΪincrease_folder_count_on_updateĴ db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); +// ɾΪdecrease_folder_count_on_updateĴ db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); +// ɾΪdecrease_folder_count_on_deleteĴ db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); +// ɾΪdelete_data_on_deleteĴ db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); +// ɾΪincrease_folder_count_on_insertĴ db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); +// ɾΪfolder_delete_notes_on_deleteĴ db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); +// ɾΪfolder_move_notes_on_trashĴ db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); + // +// ִļм db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); +// ִмļм db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); +// ִмļм db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); +// ִɾݴ db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); +// ִļм db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); +// ִɾļеıʼǴ db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); +// ִƶļеıʼǴ db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } + // ϵͳļ private void createSystemFolder(SQLiteDatabase db) { + // ContentValuesڴ洢 ContentValues values = new ContentValues(); - /** - * call record foler for call notes - */ + +// NoteColumns.IDֵΪNotes.ID_CALL_RECORD_FOLDER values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); +// NoteColumns.TYPEֵΪNotes.TYPE_SYSTEM values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +// values뵽TABLE.NOTE db.insert(TABLE.NOTE, null, values); - /** - * root folder which is default folder - */ + +// values values.clear(); +// Notes.ID_ROOT_FOLDERvalues values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); +// Notes.TYPE_SYSTEMvalues values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +// values뵽TABLE.NOTE db.insert(TABLE.NOTE, null, values); - /** - * temporary folder which is used for moving note - */ + + // values values.clear(); + // NoteColumns.IDֵΪNotes.ID_TEMPARAY_FOLDER values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); + // NoteColumns.TYPEֵΪNotes.TYPE_SYSTEM values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // values뵽TABLE.NOTE db.insert(TABLE.NOTE, null, values); - /** - * create trash folder - */ + +// values values.clear(); +// NoteColumns.IDֵΪNotes.ID_TRASH_FOLER values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); +// NoteColumns.TYPEֵΪNotes.TYPE_SYSTEM values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); +// values뵽TABLE.NOTE db.insert(TABLE.NOTE, null, values); } public void createDataTable(SQLiteDatabase db) { + // ִдݱSQL db.execSQL(CREATE_DATA_TABLE_SQL); + // ´ݱ reCreateDataTableTriggers(db); + // ִдݱSQL db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); + // ӡ־ʾݱѾ Log.d(TAG, "data table has been created"); } +// ´ݱ private void reCreateDataTableTriggers(SQLiteDatabase db) { +// ɾΪupdate_note_content_on_insertĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); +// ɾΪupdate_note_content_on_updateĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); +// ɾΪupdate_note_content_on_deleteĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); +// ִи±ʼݵĴ db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); +// ִи±ʼݵĴ db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); +// ִи±ʼݵĴ db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); } + // ȡNotesDatabaseHelperʵ static synchronized NotesDatabaseHelper getInstance(Context context) { + // mInstanceΪգ򴴽һµNotesDatabaseHelper if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } + // mInstance return mInstance; } @Override + // дonCreateڴݿ public void onCreate(SQLiteDatabase db) { + // createNoteTableNote createNoteTable(db); + // createDataTableData createDataTable(db); } + // дonUpgradeݿ汾ʱ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Ƿ´ boolean reCreateTriggers = false; + // ǷV2汾 boolean skipV2 = false; +// ɰ汾Ϊ1 if (oldVersion == 1) { + // 汾2 upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to v3 + // 汾2 + skipV2 = true; + // ɰ汾ż1 oldVersion++; } + // ɰ汾Ϊ2ҲV2汾V3汾´ͬʱɰ汾1 if (oldVersion == 2 && !skipV2) { upgradeToV3(db); reCreateTriggers = true; oldVersion++; } +// ɰ汾Ϊ3 if (oldVersion == 3) { + // 汾4 upgradeToV4(db); + // 汾ż1 oldVersion++; } +// Ҫ´ִ´ if (reCreateTriggers) { + // ´NoteTable reCreateNoteTableTriggers(db); + // ´DataTable reCreateDataTableTriggers(db); } + // ɰ汾°汾׳쳣 if (oldVersion != newVersion) { throw new IllegalStateException("Upgrade notes database to version " + newVersion + "fails"); } } + // ݿV2汾 private void upgradeToV2(SQLiteDatabase db) { + // ɾΪNOTEı db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); + // ɾΪDATAı db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); + // ΪNOTEı createNoteTable(db); + // ΪDATAı createDataTable(db); } + // ݿ⵽V3汾 private void upgradeToV3(SQLiteDatabase db) { - // drop unused triggers + +// ɾΪupdate_note_modified_date_on_insertĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); +// ɾΪupdate_note_modified_date_on_deleteĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); +// ɾΪupdate_note_modified_date_on_updateĴ db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // add a column for gtask id + +// NOTEΪGTASK_IDTEXTУĬֵΪַ db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''"); - // add a trash system folder + + // һContentValuesڴ洢Ҫ ContentValues values = new ContentValues(); + // ID_TRASH_FOLERֵIDֶ values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + // TYPE_SYSTEMֵTYPEֶ values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // ݲ뵽NOTE db.insert(TABLE.NOTE, null, values); } + // ݿV4汾 private void upgradeToV4(SQLiteDatabase db) { + // ִSQL䣬NOTEVERSIONУΪINTEGERĬֵΪ0 db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesProvider.java b/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesProvider.java index edb0a60..67bd6d6 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesProvider.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/data/NotesProvider.java @@ -35,78 +35,118 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; +// һNotesProvider̳࣬ContentProvider public class NotesProvider extends ContentProvider { + // һUriMatcher private static final UriMatcher mMatcher; + // һNotesDatabaseHelper private NotesDatabaseHelper mHelper; + // һڱʶNotesProvider private static final String TAG = "NotesProvider"; - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; + // URI + private static final int URI_NOTE = 1; // ʼURI + private static final int URI_NOTE_ITEM = 2; // ʼURI + private static final int URI_DATA = 3; // URI + private static final int URI_DATA_ITEM = 4; // URI +// URI_SEARCHֵΪ5 private static final int URI_SEARCH = 5; +// URI_SEARCH_SUGGESTֵΪ6 private static final int URI_SEARCH_SUGGEST = 6; static { +// һUriMatcherƥUri mMatcher = new UriMatcher(UriMatcher.NO_MATCH); +// ƥƥ"note"·URI_NOTE mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); +// ƥƥ"note/#"·URI_NOTE_ITEM mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); +// ƥƥ"data"·URI_DATA mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); +// ƥƥ"data/#"·URI_DATA_ITEM mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); +// ƥƥ"search"·URI_SEARCH mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); +// ƥƥ"search/*"·URI_SEARCH_SUGGEST mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); +// ƥƥ"search/*"·URI_SEARCH_SUGGEST mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); } - /** - * x'0A' represents the '\n' character in sqlite. For title and content in the search result, - * we will trim '\n' and white space in order to show more information. - */ + + // һʼǵͶӰ private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + // NoteColumns.SNIPPETеĻз滻ΪַȥβոΪSearchManager.SUGGEST_COLUMN_TEXT_1ֵ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," + // NoteColumns.SNIPPETеĻз滻ΪַȥβոΪSearchManager.SUGGEST_COLUMN_TEXT_2ֵ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," + // R.drawable.search_resultΪSearchManager.SUGGEST_COLUMN_ICON_1ֵ + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," + // Intent.ACTION_VIEWΪSearchManager.SUGGEST_COLUMN_INTENT_ACTIONֵ + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + // Notes.TextNote.CONTENT_TYPEΪSearchManager.SUGGEST_COLUMN_INTENT_DATAֵ + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + // һַ̬ڴ洢ѯ private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION - + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" - + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER - + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; +// ƴSQL䣬ѯnotesnippetֶΰַָparent_idID_TRASH_FOLERtypeTYPE_NOTEļ¼ + + " FROM " + TABLE.NOTE // Ӳѯ + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" // ӲѯƥƬ + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER // Ӳѯųվ + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; // Ӳѯƥʼ @Override + // дonCreate public boolean onCreate() { + // ȡNotesDatabaseHelperʵ + // ȡNotesDatabaseHelperʵ mHelper = NotesDatabaseHelper.getInstance(getContext()); + // true return true; } @Override + // дqueryڲѯ +// ݸUriͶӰѡ˳ѯ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { +// һα Cursor c = null; +// ȡһֻݿ SQLiteDatabase db = mHelper.getReadableDatabase(); +// һַ͵ıidʼΪnull String id = null; +// ݴuriƥӦURI_NOTEȻִӦIJ switch (mMatcher.match(uri)) { + // ƥ䵽URI_NOTEִ² case URI_NOTE: + // ѯݿ⣬ȡָе +// ѯݿеNOTEָе c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); +// selectionselectionArgsɸѡؽ break; +// URI_NOTE_ITEMֵȡ·еĵڶΪid case URI_NOTE_ITEM: id = uri.getPathSegments().get(1); +// ʹidΪѯѯݿеNOTEؽ c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs, null, null, sortOrder); break; +// URI_DATA case URI_DATA: + // ݿвѯݣһCursor c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); break; +// URI_DATA_ITEMֵȡ·еĵڶΪid case URI_DATA_ITEM: id = uri.getPathSegments().get(1); +// ѯݿ⣬ȡָidݣprojectionΪѯУselectionΪѯselectionArgsΪѯIJ c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs, null, null, sortOrder); break; @@ -166,13 +206,13 @@ public class NotesProvider extends ContentProvider { default: throw new IllegalArgumentException("Unknown URI " + uri); } - // Notify the note uri + if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); } - // Notify the data uri + if (dataId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); @@ -194,10 +234,7 @@ public class NotesProvider extends ContentProvider { break; case URI_NOTE_ITEM: id = uri.getPathSegments().get(1); - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ + long noteId = Long.valueOf(id); if (noteId <= 0) { break; @@ -298,7 +335,7 @@ public class NotesProvider extends ContentProvider { @Override public String getType(Uri uri) { - // TODO Auto-generated method stub + return null; } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/MetaData.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/MetaData.java index 3a2050b..9a1e5a4 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/MetaData.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/MetaData.java @@ -16,48 +16,68 @@ package net.micode.notes.gtask.data; +// CursorLog import android.database.Cursor; import android.util.Log; +// GTaskStringUtils import net.micode.notes.tool.GTaskStringUtils; +// JSONExceptionJSONObject import org.json.JSONException; import org.json.JSONObject; public class MetaData extends Task { +// һڱʶMetaData private final static String TAG = MetaData.class.getSimpleName(); +// һΪmRelatedGidַʼֵΪnull private String mRelatedGid = null; + // Ԫ public void setMeta(String gid, JSONObject metaInfo) { try { + // gidmetaInfo metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); } catch (JSONException e) { + // JSONException쳣ӡ־ Log.e(TAG, "failed to put related gid"); } +// ñʼ setNotes(metaInfo.toString()); +// setName(GTaskStringUtils.META_NOTE_NAME); } + // ȡGID public String getRelatedGid() { return mRelatedGid; } @Override + // дisWorthSaving() public boolean isWorthSaving() { + // getNotes()صֵΪnull򷵻true򷵻false return getNotes() != null; } @Override + // дsetContentByRemoteJSON public void setContentByRemoteJSON(JSONObject js) { + // øsetContentByRemoteJSON super.setContentByRemoteJSON(js); + // getNotes()Ϊ if (getNotes() != null) { try { + // getNotes()ֵתΪJSONObject JSONObject metaInfo = new JSONObject(getNotes().trim()); + // ȡmetaInfoеGTaskStringUtils.META_HEAD_GTASK_IDֵ mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); } catch (JSONException e) { + // ӡ־ Log.w(TAG, "failed to get related gid"); + // mRelatedGidΪnull mRelatedGid = null; } } @@ -65,17 +85,22 @@ public class MetaData extends Task { @Override public void setContentByLocalJSON(JSONObject js) { - // this function should not be called + + // ݱJSON throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); } @Override + // д෽ȡJSON public JSONObject getLocalJSONFromContent() { + // ׳ǷʴʾMetaData:getLocalJSONFromContentӦñ throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); } @Override + // дgetSyncAction public int getSyncAction(Cursor c) { + // ȡCursor throw new IllegalAccessError("MetaData:getSyncAction should not be called"); } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Node.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Node.java index 63950e0..7aa74b1 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Node.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Node.java @@ -21,80 +21,114 @@ import android.database.Cursor; import org.json.JSONObject; 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; + // ڵID private String mGid; + // ڵ private String mName; + // ޸ʱ private long mLastModified; + // Ƿɾ private boolean mDeleted; + // 캯 + // 캯ʼNode public Node() { + // ʼmGidΪnull mGid = null; + // ʼmNameΪַ mName = ""; + // ʼmLastModifiedΪ0 mLastModified = 0; + // ʼmDeletedΪfalse mDeleted = false; } +// ȡ public abstract JSONObject getCreateAction(int actionId); +// ȡ¶ public abstract JSONObject getUpdateAction(int actionId); +// ԶJSON public abstract void setContentByRemoteJSON(JSONObject js); +// ݱJSON public abstract void setContentByLocalJSON(JSONObject js); +// лȡJSON public abstract JSONObject getLocalJSONFromContent(); +// αȡͬ public abstract int getSyncAction(Cursor c); + // GID public void setGid(String gid) { this.mGid = gid; } + // ֵķ public void setName(String name) { + // nameֵԱmName this.mName = name; } + // ޸ʱ public void setLastModified(long lastModified) { this.mLastModified = lastModified; } +// Ƿɾı־ public void setDeleted(boolean deleted) { this.mDeleted = deleted; } + // ȡGid public String getGid() { return this.mGid; } + // ȡ public String getName() { return this.mName; } + // ȡ޸ʱ public long getLastModified() { return this.mLastModified; } public boolean getDeleted() { + // mDeletedֵ return this.mDeleted; } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlData.java index d3ec3be..430e823 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -24,148 +24,209 @@ import android.database.Cursor; import android.net.Uri; import android.util.Log; +// Notes࣬Notesкݳ 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; +// NotesDatabaseHelper࣬Notesı import net.micode.notes.data.NotesDatabaseHelper.TABLE; +// ActionFailureException࣬ڴʧ쳣 import net.micode.notes.gtask.exception.ActionFailureException; +// JSONص࣬ڴJSON import org.json.JSONException; import org.json.JSONObject; public class SqlData { + // һڱʶЧID private static final String TAG = SqlData.class.getSimpleName(); 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 }; - public static final int DATA_ID_COLUMN = 0; + public static final int DATA_ID_COLUMN = 0; // ID - public static final int DATA_MIME_TYPE_COLUMN = 1; + public static final int DATA_MIME_TYPE_COLUMN = 1; // MIME - public static final int DATA_CONTENT_COLUMN = 2; + 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_1_COLUMN = 3; // 1 - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; // 3 - private ContentResolver mContentResolver; + private ContentResolver mContentResolver; // ݽ - private boolean mIsCreate; + private boolean mIsCreate; // Ƿ񴴽 - private long mDataId; + private long mDataId; // ID - private String mDataMimeType; + private String mDataMimeType; // MIME - private String mDataContent; + private String mDataContent; // - private long mDataContentData1; + private long mDataContentData1; // 1 - private String mDataContentData3; + private String mDataContentData3; // 3 - private ContentValues mDiffDataValues; + private ContentValues mDiffDataValues; // ֵ +// 캯ʼSqlData public SqlData(Context context) { + // ȡContentResolver mContentResolver = context.getContentResolver(); + // Ϊ״̬ mIsCreate = true; + // ʼIDΪЧID mDataId = INVALID_ID; + // ʼΪNOTE mDataMimeType = DataConstants.NOTE; + // ʼΪַ mDataContent = ""; + // ʼ1Ϊ0 mDataContentData1 = 0; + // ʼ3Ϊַ mDataContentData3 = ""; + // ʼContentValues mDiffDataValues = new ContentValues(); } + // 캯ڴCursorм public SqlData(Context context, Cursor c) { + // ȡContentResolver mContentResolver = context.getContentResolver(); + // mIsCreateΪfalse mIsCreate = false; + // Cursorм loadFromCursor(c); + // ʼmDiffDataValues mDiffDataValues = new ContentValues(); } +// αм private void loadFromCursor(Cursor c) { + // αлȡID mDataId = c.getLong(DATA_ID_COLUMN); + // αлȡMIME mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + // αлȡ mDataContent = c.getString(DATA_CONTENT_COLUMN); + // αлȡ1 mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + // αлȡ3 mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } + // public void setContent(JSONObject js) throws JSONException { + // ȡID long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + // Ǵ״̬IDһ£ID if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); } + // ID 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); } + // mDataContent = dataContent; + // ȡjsDATA1ֶεֵûֵΪ0 long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + // ǴmDataContentData1ֵdataContentData1ֵȣdataContentData1ֵmDiffDataValues if (mIsCreate || mDataContentData1 != dataContentData1) { mDiffDataValues.put(DataColumns.DATA1, dataContentData1); } + // dataContentData1ֵmDataContentData1 mDataContentData1 = dataContentData1; + // ȡjsDATA3ֶεֵûֵΪַ String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + // ǴmDataContentData3ֵdataContentData3ֵȣdataContentData3ֵmDiffDataValues if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { mDiffDataValues.put(DataColumns.DATA3, dataContentData3); } + // dataContentData3ֵmDataContentData3 mDataContentData3 = dataContentData3; } public JSONObject getContent() throws JSONException { + // mIsCreateΪtrue˵ûݿд if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } + // һJSONObject JSONObject js = new JSONObject(); + // mDataIdJSONObject js.put(DataColumns.ID, mDataId); + // mDataMimeTypeJSONObject js.put(DataColumns.MIME_TYPE, mDataMimeType); + // mDataContentJSONObject js.put(DataColumns.CONTENT, mDataContent); + // mDataContentData1JSONObject js.put(DataColumns.DATA1, mDataContentData1); + // mDataContentData3JSONObject js.put(DataColumns.DATA3, mDataContentData3); + // JSONObject return js; } public void commit(long noteId, boolean validateVersion, long version) { + // Ǵ if (mIsCreate) { + // IDЧֵаID if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + // ƳID mDiffDataValues.remove(DataColumns.ID); } + // noteIdֵ mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + // Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); try { + // ȡݵID mDataId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { + // ȡIDʧܣӡ־׳쳣 Log.e(TAG, "Get note id error :" + e.toString()); throw new ActionFailureException("create note failed"); } } else { + // mDiffDataValuesĴС0 if (mDiffDataValues.size() > 0) { int result = 0; + // validateVersionΪfalse if (!validateVersion) { + // mContentResolverе result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); } else { + // mContentResolverеݣ֤汾ŵ result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE @@ -173,16 +234,21 @@ public class SqlData { String.valueOf(noteId), String.valueOf(version) }); } + // ½Ϊ0 if (result == 0) { + // ӡ־ Log.w(TAG, "there is no update. maybe user updates note when syncing"); } } } + // mDiffDataValues mDiffDataValues.clear(); + // mIsCreateΪfalse mIsCreate = false; } +// ȡmDataIdֵ public long getId() { return mDataId; } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java index 79a4095..c3fae0c 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -39,10 +39,13 @@ import java.util.ArrayList; public class SqlNote { + // һڱʶļ private static final String TAG = SqlNote.class.getSimpleName(); + // һڱʶЧID private static final int INVALID_ID = -99999; + // һڴ洢NoteColumnsе 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, @@ -52,175 +55,241 @@ public class SqlNote { NoteColumns.VERSION }; - public static final int ID_COLUMN = 0; + public static final int ID_COLUMN = 0; // ID - public static final int ALERTED_DATE_COLUMN = 1; + public static final int ALERTED_DATE_COLUMN = 1; // - public static final int BG_COLOR_ID_COLUMN = 2; + public static final int BG_COLOR_ID_COLUMN = 2; // ɫID - public static final int CREATED_DATE_COLUMN = 3; + public static final int CREATED_DATE_COLUMN = 3; // - public static final int HAS_ATTACHMENT_COLUMN = 4; + public static final int HAS_ATTACHMENT_COLUMN = 4; // Ƿи - public static final int MODIFIED_DATE_COLUMN = 5; + public static final int MODIFIED_DATE_COLUMN = 5; // ޸ - public static final int NOTES_COUNT_COLUMN = 6; + public static final int NOTES_COUNT_COLUMN = 6; // ʼ - public static final int PARENT_ID_COLUMN = 7; + public static final int PARENT_ID_COLUMN = 7; // ID - public static final int SNIPPET_COLUMN = 8; + public static final int SNIPPET_COLUMN = 8; // ժҪ - public static final int TYPE_COLUMN = 9; + public static final int TYPE_COLUMN = 9; // - public static final int WIDGET_ID_COLUMN = 10; + public static final int WIDGET_ID_COLUMN = 10; // СID - public static final int WIDGET_TYPE_COLUMN = 11; + public static final int WIDGET_TYPE_COLUMN = 11; // С - public static final int SYNC_ID_COLUMN = 12; + public static final int SYNC_ID_COLUMN = 12; // ͬID - public static final int LOCAL_MODIFIED_COLUMN = 13; + public static final int LOCAL_MODIFIED_COLUMN = 13; // ޸ - public static final int ORIGIN_PARENT_ID_COLUMN = 14; + public static final int ORIGIN_PARENT_ID_COLUMN = 14; // ԭʼID - public static final int GTASK_ID_COLUMN = 15; + public static final int GTASK_ID_COLUMN = 15; // GoogleID - public static final int VERSION_COLUMN = 16; + public static final int VERSION_COLUMN = 16; // 汾 - private Context mContext; + private Context mContext; // - private ContentResolver mContentResolver; + private ContentResolver mContentResolver; // ݽ - private boolean mIsCreate; + private boolean mIsCreate; // Ƿ񴴽 - private long mId; + private long mId; // ID - private long mAlertDate; + private long mAlertDate; // - private int mBgColorId; + private int mBgColorId; // ɫID - private long mCreatedDate; + private long mCreatedDate; // - private int mHasAttachment; + private int mHasAttachment; // Ƿи - private long mModifiedDate; + private long mModifiedDate; // ޸ - private long mParentId; + private long mParentId; // ID - private String mSnippet; + private String mSnippet; // ժҪ - private int mType; + private int mType; // - private int mWidgetId; + private int mWidgetId; // СID - private int mWidgetType; + private int mWidgetType; // С - private long mOriginParent; + private long mOriginParent; // ԭʼID - private long mVersion; + private long mVersion; // 汾 - private ContentValues mDiffNoteValues; + private ContentValues mDiffNoteValues; // ͬʼֵ - private ArrayList mDataList; + private ArrayList mDataList; // б +// 캯ڳʼSqlNote public SqlNote(Context context) { + // ʼ mContext = context; + // ʼݽ mContentResolver = context.getContentResolver(); + // Ϊ״̬ mIsCreate = true; + // ЧID mId = INVALID_ID; + // Ϊ0 mAlertDate = 0; + // ñɫIDΪĬֵ mBgColorId = ResourceParser.getDefaultBgId(context); + // ôΪǰʱ mCreatedDate = System.currentTimeMillis(); + // ǷиΪ0 mHasAttachment = 0; + // ޸Ϊǰʱ mModifiedDate = System.currentTimeMillis(); + // øIDΪ0 mParentId = 0; + // ƬΪַ mSnippet = ""; + // Ϊʼ mType = Notes.TYPE_NOTE; + // СIDΪЧֵ mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + // СΪЧֵ mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + // ԭʼIDΪ0 mOriginParent = 0; + // ð汾Ϊ0 mVersion = 0; + // ʼֵ mDiffNoteValues = new ContentValues(); + // ʼб mDataList = new ArrayList(); } +// 캯ڴCursorмSqlNote public SqlNote(Context context, Cursor c) { + // Ķ mContext = context; + // ȡContentResolver mContentResolver = context.getContentResolver(); + // Ϊδ mIsCreate = false; + // CursorмSqlNote loadFromCursor(c); + // ʼб mDataList = new ArrayList(); + // ΪNotes.TYPE_NOTE if (mType == Notes.TYPE_NOTE) loadDataContent(); + // ʼContentValues mDiffNoteValues = new ContentValues(); } + // 캯ĺid public SqlNote(Context context, long id) { + // mContext = context; + // ȡݽ mContentResolver = context.getContentResolver(); + // Ϊδ mIsCreate = false; + // αм loadFromCursor(id); + // ʼб mDataList = new ArrayList(); + // Ϊʼǣ if (mType == Notes.TYPE_NOTE) loadDataContent(); + // ʼֵ mDiffNoteValues = new ContentValues(); } private void loadFromCursor(long id) { + // ݿвѯָidıʼ Cursor c = null; try { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", new String[] { String.valueOf(id) }, null); + // ѯΪ if (c != null) { + // αƶһ¼ c.moveToNext(); + // αм loadFromCursor(c); } else { + // ѯΪգ־ Log.w(TAG, "loadFromCursor: cursor = null"); } } finally { + // رα if (c != null) c.close(); } } + // αм private void loadFromCursor(Cursor c) { + // ȡID mId = c.getLong(ID_COLUMN); + // ȡ mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + // ȡɫID mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + // ȡ mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + // ȡǷи mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + // ȡ޸ mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + // ȡID mParentId = c.getLong(PARENT_ID_COLUMN); + // ȡƬ mSnippet = c.getString(SNIPPET_COLUMN); + // ȡ mType = c.getInt(TYPE_COLUMN); + // ȡСID mWidgetId = c.getInt(WIDGET_ID_COLUMN); + // ȡС mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + // ȡ汾 mVersion = c.getLong(VERSION_COLUMN); } private void loadDataContent() { + // һα Cursor c = null; + // б mDataList.clear(); try { + // ѯݿ⣬ȡָid c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, "(note_id=?)", new String[] { String.valueOf(mId) }, null); + // α겻Ϊ if (c != null) { + // αû if (c.getCount() == 0) { + // ӡ־ Log.w(TAG, "it seems that the note has not data"); + // return; } + // α while (c.moveToNext()) { + // һSqlData󣬲αеݸֵö SqlData data = new SqlData(mContext, c); + // öӵб mDataList.add(data); } } else { + // ӡ־ Log.w(TAG, "loadDataContent: cursor = null"); } } finally { + // رα if (c != null) c.close(); } @@ -228,114 +297,164 @@ public class SqlNote { public boolean setContent(JSONObject js) { try { + // ȡnote JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + // noteϵͳļУ if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + // noteϵͳļУϢ Log.w(TAG, "cannot set system folder"); } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type + + // noteļ + // ȡnoteժҪ String snippet = note.has(NoteColumns.SNIPPET) ? note .getString(NoteColumns.SNIPPET) : ""; + // ǴnoteժҪmSnippetȣժҪmDiffNoteValues if (mIsCreate || !mSnippet.equals(snippet)) { mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); } + // ժҪֵmSnippet mSnippet = snippet; + // ȡnote int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) : Notes.TYPE_NOTE; + // ǴnotenoteͺmTypeͬtypemDiffNoteValues if (mIsCreate || mType != type) { mDiffNoteValues.put(NoteColumns.TYPE, type); } + // mType mType = type; } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + // ȡnote JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + // ȡnoteid long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + // ǴnotenoteidmIdͬidmDiffNoteValues if (mIsCreate || mId != id) { mDiffNoteValues.put(NoteColumns.ID, id); } + // mId mId = id; +// ȡ long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note .getLong(NoteColumns.ALERTED_DATE) : 0; +// ½ʼǻб仯ڷֵ if (mIsCreate || mAlertDate != alertDate) { mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); } +// mAlertDate = alertDate; +// ȡɫID 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 mBgColorId = bgColorId; +// ȡ long createDate = note.has(NoteColumns.CREATED_DATE) ? note .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); +// ½ʼǻߴб仯򽫴ڷֵ if (mIsCreate || mCreatedDate != createDate) { mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); } +// ´ mCreatedDate = createDate; +// ȡǷи int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note .getInt(NoteColumns.HAS_ATTACHMENT) : 0; +// ½ʼǻǷиб仯Ƿиֵ if (mIsCreate || mHasAttachment != hasAttachment) { mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); } +// Ƿи mHasAttachment = hasAttachment; +// ȡnote޸ڣûȡǰʱ long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); +// Ǵnote޸ڲͬ޸ڷmDiffNoteValues if (mIsCreate || mModifiedDate != modifiedDate) { mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); } +// mModifiedDate mModifiedDate = modifiedDate; +// ȡnoteĸidûΪ0 long parentId = note.has(NoteColumns.PARENT_ID) ? note .getLong(NoteColumns.PARENT_ID) : 0; +// Ǵnote߸idͬ򽫸idmDiffNoteValues if (mIsCreate || mParentId != parentId) { mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); } +// mParentId mParentId = parentId; +// ȡnoteժҪûΪַ String snippet = note.has(NoteColumns.SNIPPET) ? note .getString(NoteColumns.SNIPPET) : ""; +// ǴnoteժҪͬժҪmDiffNoteValues if (mIsCreate || !mSnippet.equals(snippet)) { mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); } +// mSnippet mSnippet = snippet; + // ȡnoteеtypeֵûʹNotes.TYPE_NOTE int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) : Notes.TYPE_NOTE; + // ǴnotetypeֵmTypeͬtypeֵmDiffNoteValues if (mIsCreate || mType != type) { mDiffNoteValues.put(NoteColumns.TYPE, type); } + // mTypeֵ mType = type; + // ȡnoteеwidgetIdֵûʹAppWidgetManager.INVALID_APPWIDGET_ID int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) : AppWidgetManager.INVALID_APPWIDGET_ID; + // ǴnotewidgetIdֵmWidgetIdͬwidgetIdֵmDiffNoteValues if (mIsCreate || mWidgetId != widgetId) { mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); } + // mWidgetIdֵ mWidgetId = widgetId; + // ȡnoteеwidgetTypeֵûʹNotes.TYPE_WIDGET_INVALIDE int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + // ǴnotewidgetTypeֵmWidgetTypeͬwidgetTypeֵmDiffNoteValues if (mIsCreate || mWidgetType != widgetType) { mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); } + // mWidgetTypeֵ mWidgetType = widgetType; +// ȡnoteORIGIN_PARENT_IDûֵΪ0 long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; +// ǴnotemOriginParentoriginParentȣoriginParentmDiffNoteValues if (mIsCreate || mOriginParent != originParent) { mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); } +// mOriginParentֵ mOriginParent = originParent; +// dataArrayеÿһJSONObject for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); SqlData sqlData = null; + // dataIDȡIDֵ if (data.has(DataColumns.ID)) { long dataId = data.getLong(DataColumns.ID); + // mDataListҵdataIdȵSqlData for (SqlData temp : mDataList) { if (dataId == temp.getId()) { sqlData = temp; @@ -343,64 +462,94 @@ public class SqlNote { } } + // sqlDataΪգ򴴽һµSqlData󣬲ӵmDataList if (sqlData == null) { sqlData = new SqlData(mContext); mDataList.add(sqlData); } + // sqlDataΪdata sqlData.setContent(data); } } } catch (JSONException e) { + // JSON쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // false return false; } + // true return true; } public JSONObject getContent() { + // ȡ try { JSONObject js = new JSONObject(); + // mIsCreateΪtrueʾûݿд if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } +// һSONObjectΪnote JSONObject note = new JSONObject(); +// mTypeNotes.TYPE_NOTE if (mType == Notes.TYPE_NOTE) { + // mIdnote note.put(NoteColumns.ID, mId); + // mAlertDatenote note.put(NoteColumns.ALERTED_DATE, mAlertDate); + // mBgColorIdnote note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + // mCreatedDatenote note.put(NoteColumns.CREATED_DATE, mCreatedDate); + // mHasAttachmentnote note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + // mModifiedDatenote note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + // mParentIdnote note.put(NoteColumns.PARENT_ID, mParentId); + // mSnippetnote note.put(NoteColumns.SNIPPET, mSnippet); + // mTypenote note.put(NoteColumns.TYPE, mType); + // mWidgetIdnote note.put(NoteColumns.WIDGET_ID, mWidgetId); + // mWidgetTypenote note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + // mOriginParentnote note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + // notejs js.put(GTaskStringUtils.META_HEAD_NOTE, note); + // һJSONArray JSONArray dataArray = new JSONArray(); + // mDataListеÿһSqlData for (SqlData sqlData : mDataList) { + // ȡSqlDataеcontentԣJSONObject JSONObject data = sqlData.getContent(); + // JSONObjectΪգӵdataArray if (data != null) { dataArray.put(data); } } js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { + // mTypeļлϵͳͣmIdmTypemSnippetnote note.put(NoteColumns.ID, mId); note.put(NoteColumns.TYPE, mType); note.put(NoteColumns.SNIPPET, mSnippet); + // notejs js.put(GTaskStringUtils.META_HEAD_NOTE, note); } return js; } catch (JSONException e) { + // JSONExceptionӡ־ Log.e(TAG, e.toString()); e.printStackTrace(); } @@ -408,73 +557,97 @@ public class SqlNote { } public void setParentId(long id) { + // øID mParentId = id; + // IDӵֵ mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } public void setGtaskId(String gid) { + // GtaskId mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } public void setSyncId(long syncId) { + // ͬID mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); } public void resetLocalModified() { + // ñ޸ mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); } public long getId() { + // ȡID return mId; } public long getParentId() { + // ȡID + // ظID return mParentId; } + // Ƭ public String getSnippet() { return mSnippet; } + // жǷΪʼ public boolean isNoteType() { return mType == Notes.TYPE_NOTE; } public void commit(boolean validateVersion) { + // Ǵ if (mIsCreate) { + // IDЧmDiffNoteValuesаID if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + // mDiffNoteValuesƳID mDiffNoteValues.remove(NoteColumns.ID); } + // ݵNotes.CONTENT_NOTE_URI Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); try { + // ȡݵID mId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { + // ȡIDʧܣӡ־׳ActionFailureException쳣 Log.e(TAG, "Get note id error :" + e.toString()); throw new ActionFailureException("create note failed"); } + // IDΪ0׳IllegalStateException쳣 if (mId == 0) { throw new IllegalStateException("Create thread id failed"); } + // ΪNotes.TYPE_NOTE if (mType == Notes.TYPE_NOTE) { + // mDataList for (SqlData sqlData : mDataList) { + // ύ sqlData.commit(mId, false, -1); } } } else { + // mIdСڵ0mIdNotes.ID_ROOT_FOLDERNotes.ID_CALL_RECORD_FOLDER׳쳣 if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { Log.e(TAG, "No such note"); throw new IllegalStateException("Try to update note with invalid id"); } + // mDiffNoteValuesĴС0°汾 if (mDiffNoteValues.size() > 0) { mVersion ++; int result = 0; + // validateVersionΪfalseֱӸ if (!validateVersion) { result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + NoteColumns.ID + "=?)", new String[] { String.valueOf(mId) }); + // validateVersionΪtrue°汾СڵmVersionļ¼ } else { result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", @@ -482,11 +655,13 @@ public class SqlNote { String.valueOf(mId), String.valueOf(mVersion) }); } + // ½Ϊ0־ if (result == 0) { Log.w(TAG, "there is no update. maybe user updates note when syncing"); } } + // mTypeNotes.TYPE_NOTEmDataListеÿSqlData󣬲commitmIdvalidateVersionmVersion if (mType == Notes.TYPE_NOTE) { for (SqlData sqlData : mDataList) { sqlData.commit(mId, validateVersion, mVersion); @@ -494,12 +669,15 @@ public class SqlNote { } } - // refresh local info + loadFromCursor(mId); + // mTypeNotes.TYPE_NOTEloadDataContent() if (mType == Notes.TYPE_NOTE) loadDataContent(); + // mDiffNoteValues mDiffNoteValues.clear(); + // mIsCreateΪfalse mIsCreate = false; } } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Task.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Task.java index 6a19454..b83a533 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/Task.java @@ -31,72 +31,105 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; - public class Task extends Node { + + // һڱʶTaskļ private static final String TAG = Task.class.getSimpleName(); + // һ͵ıڱʶǷ private boolean mCompleted; + // һַ͵ıڴ洢ıעϢ private String mNotes; + // һJSONObject͵ıڴ洢ԪϢ private JSONObject mMetaInfo; + // һTask͵ıڴ洢ǰһֵ private Task mPriorSibling; + // һTaskList͵ıڴ洢ĸб private TaskList mParent; +// 캯ʼTask public Task() { + // øĹ캯 super(); + // ʼmCompletedΪfalse mCompleted = false; + // ʼmNotesΪnull mNotes = null; + // ʼmPriorSiblingΪnull mPriorSibling = null; + // ʼmParentΪnull mParent = null; + // ʼmMetaInfoΪnull mMetaInfo = null; } +// actionIdȡ public JSONObject getCreateAction(int actionId) { + // һJSONObject JSONObject js = new JSONObject(); try { - // action_type + + // actionTypeΪ js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - // action_id + + // actionIdΪactionId js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // index + + // indexΪ js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - // entity_delta + + // һJSONObject JSONObject entity = new JSONObject(); + // nameΪǰ entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + // creatorIdΪnull entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + // entityTypeΪ entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_TASK); + // getNotes()ΪգgetNotes()ֵentity if (getNotes() != null) { entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } + // entityjs js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - // parent_id + + // mParentGidjs js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - // dest_parent_type + + // GTaskStringUtils.GTASK_JSON_TYPE_GROUPjs js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - // list_id + + // mParentGidjs js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - // prior_sibling_id + + // mPriorSiblingΪգmPriorSiblingGidjs + // mPriorSiblingΪգmPriorSiblingGidjs if (mPriorSibling != null) { js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); } + // JSONException쳣 } catch (JSONException e) { + // ӡ쳣Ϣ Log.e(TAG, e.toString()); + // ӡ쳣ջϢ e.printStackTrace(); + // ׳ActionFailureException쳣 throw new ActionFailureException("fail to generate task-create jsonobject"); } @@ -104,207 +137,280 @@ public class Task extends Node { } public JSONObject getUpdateAction(int actionId) { + // һJSONObject JSONObject js = new JSONObject(); try { - // action_type + + // actionΪ js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - // action_id + + // actionIdjs js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // id + + // getGid()ķֵjs js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - // entity_delta + + // һJSONObject JSONObject entity = new JSONObject(); + // getName()ķֵJSONObjectУΪGTASK_JSON_NAME entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + // getNotes()ֵΪnullgetNotes()ķֵJSONObjectУΪGTASK_JSON_NOTES if (getNotes() != null) { entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } + // getDeleted()ķֵJSONObjectУΪGTASK_JSON_DELETED entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + // JSONObjectjsУΪGTASK_JSON_ENTITY_DELTA js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); } catch (JSONException e) { + // JSON쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // ׳Զ쳣 throw new ActionFailureException("fail to generate task-update jsonobject"); } return js; } + // ԶJSON public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { - // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + // jsonGTaskStringUtils.GTASK_JSON_IDֶΣGid setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } - // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + // jsonGTaskStringUtils.GTASK_JSON_LAST_MODIFIEDֶΣLastModified setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); } - // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + // jsonGTaskStringUtils.GTASK_JSON_NAMEֶΣName setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); } - // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + // jsonGTaskStringUtils.GTASK_JSON_NOTESֶΣNotes setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); } - // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + // jsonGTaskStringUtils.GTASK_JSON_DELETEDֶΣDeleted setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); } - // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + // jsonGTaskStringUtils.GTASK_JSON_COMPLETEDֶΣCompleted setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); } } catch (JSONException e) { + // JSONException쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // ׳Զ쳣ActionFailureException throw new ActionFailureException("fail to get task content from jsonobject"); } } } public void setContentByLocalJSON(JSONObject js) { + // жϴJSONObjectǷΪգǷMETA_HEAD_NOTEMETA_HEAD_DATAֶ if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + // ־ Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } try { + // ȡJSONеnote JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + // ȡJSONеdataArray JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + // noteͲNotes.TYPE_NOTEϢ if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { Log.e(TAG, "invalid type"); return; } +// dataArray for (int i = 0; i < dataArray.length(); i++) { + // ȡеJSONObject JSONObject data = dataArray.getJSONObject(i); + // жMIME_TYPEǷΪNOTE if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + // setName(data.getString(DataColumns.CONTENT)); + // ѭ break; } } +// JSONException쳣 } catch (JSONException e) { + // ӡ쳣Ϣ Log.e(TAG, e.toString()); + // ӡ쳣ջϢ e.printStackTrace(); } } public JSONObject getLocalJSONFromContent() { + // ȡʼ String name = getName(); try { + // mMetaInfoΪգ˵½ıʼ if (mMetaInfo == null) { - // new task created from web + + // nameΪգ˵ʼΪ if (name == null) { Log.w(TAG, "the note seems to be an empty one"); return null; } JSONObject js = new JSONObject(); + // һJSONObject JSONObject note = new JSONObject(); + // һJSONObject JSONArray dataArray = new JSONArray(); + // һJSONArray JSONObject data = new JSONObject(); + // һJSONObject data.put(DataColumns.CONTENT, name); + // namedata dataArray.put(data); + // datadataArray js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + // dataArrayjs note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + // Notes.TYPE_NOTEnote js.put(GTaskStringUtils.META_HEAD_NOTE, note); + // notejs return js; } else { - // synced task + + // ȡԪϢеıʼǶ JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + // ȡԪϢе JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + // for (int i = 0; i < dataArray.length(); i++) { + // ȡеÿһݶ JSONObject data = dataArray.getJSONObject(i); + // ݶMIMEΪʼ if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + // ݶcontentֶΪgetName()ķֵ data.put(DataColumns.CONTENT, getName()); + // ѭ break; } } + // notetypeΪNotes.TYPE_NOTE note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + // mMetaInfo return mMetaInfo; } } catch (JSONException e) { + // ӡ־ Log.e(TAG, e.toString()); + // ӡջ e.printStackTrace(); + // null return null; } } public void setMetaInfo(MetaData metaData) { + // жϴmetaDataǷΪգmetaDataеnotesǷΪ if (metaData != null && metaData.getNotes() != null) { try { + // metaDataеnotesתΪJSONObject mMetaInfo = new JSONObject(metaData.getNotes()); } catch (JSONException e) { + // תʧܣӡ־mMetaInfoΪnull Log.w(TAG, e.toString()); mMetaInfo = null; } } } + // αcȡͬ public int getSyncAction(Cursor c) { try { + // ȡnoteInfo JSONObject noteInfo = null; if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); } + // noteInfoΪգ˵note metaѾɾ if (noteInfo == null) { Log.w(TAG, "it seems that note meta has been deleted"); return SYNC_ACTION_UPDATE_REMOTE; } + // noteInfoûID˵remote note idѾɾ if (!noteInfo.has(NoteColumns.ID)) { Log.w(TAG, "remote note id seems to be deleted"); return SYNC_ACTION_UPDATE_LOCAL; } - // validate the note id now + + // note idǷƥ if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { Log.w(TAG, "note id doesn't match"); return SYNC_ACTION_UPDATE_LOCAL; } + // 鱾Ƿ޸ if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update + + // ͬidǷƥ if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side + return SYNC_ACTION_NONE; } else { - // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; } } else { - // validate gtask id + + // gtask idǷƥ if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { Log.e(TAG, "gtask id doesn't match"); return SYNC_ACTION_ERROR; } + // ͬidǷƥ if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only + return SYNC_ACTION_UPDATE_REMOTE; } else { return SYNC_ACTION_UPDATE_CONFLICT; } } } catch (Exception e) { + // ӡ־ Log.e(TAG, e.toString()); + // ӡջϢ e.printStackTrace(); } @@ -312,39 +418,48 @@ public class Task extends Node { } public boolean isWorthSaving() { + // жǷҪ棬mMetaInfoΪգgetName()Ϊҳȴ0getNotes()Ϊҳȴ0򷵻true return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } public void setCompleted(boolean completed) { + // Ƿ this.mCompleted = completed; } public void setNotes(String notes) { + // ע this.mNotes = notes; } public void setPriorSibling(Task priorSibling) { + // ǰһֵ this.mPriorSibling = priorSibling; } public void setParent(TaskList parent) { + // ĸб this.mParent = parent; } public boolean getCompleted() { + // Ƿ return this.mCompleted; } public String getNotes() { + // ıע return this.mNotes; } public Task getPriorSibling() { + // ǰһֵ return this.mPriorSibling; } public TaskList getParent() { + // ĸб return this.mParent; } diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/TaskList.java index 4ea21c5..e5db5ac 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -31,127 +31,182 @@ import java.util.ArrayList; public class TaskList extends Node { + // һڱʶTaskListļ private static final String TAG = TaskList.class.getSimpleName(); + // һͱڴ洢TaskList private int mIndex; + // һArrayListڴ洢TaskListӽڵ private ArrayList mChildren; + // 캯ʼmChildrenmIndex public TaskList() { super(); mChildren = new ArrayList(); mIndex = 1; } + // actionIdȡ public JSONObject getCreateAction(int actionId) { + // һJSONObject JSONObject js = new JSONObject(); try { - // action_type + + // GTASK_JSON_ACTION_TYPEֵΪGTASK_JSON_ACTION_TYPE_CREATE js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - // action_id + + // GTASK_JSON_ACTION_IDֵΪactionId js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // index + + // GTASK_JSON_INDEXֵΪmIndex js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - // entity_delta + + // һJSONObjectentity JSONObject entity = new JSONObject(); + // GTASK_JSON_NAMEֵΪgetName()ķֵ entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + // GTASK_JSON_CREATOR_IDֵΪ"null" entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + // GTASK_JSON_ENTITY_TYPEֵΪGTASK_JSON_TYPE_GROUP entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + // GTASK_JSON_ENTITY_DELTAֵΪentity js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); } catch (JSONException e) { + // JSONException쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // ׳ActionFailureException쳣ʾtasklist-create jsonobjectʧ throw new ActionFailureException("fail to generate tasklist-create jsonobject"); } + // js return js; } + // actionIdȡ² public JSONObject getUpdateAction(int actionId) { + // һJSONObject JSONObject js = new JSONObject(); try { - // action_type + + // actionΪ js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - // action_id + + // actionId js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - // id + + // gid js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - // entity_delta + + // entity JSONObject entity = new JSONObject(); + // entityname entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + // entitydeleted entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + // entityjs js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); } catch (JSONException e) { + // JSONException쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // ׳ActionFailureException쳣 throw new ActionFailureException("fail to generate tasklist-update jsonobject"); } + // js return js; } + // ԶJSON public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { - // id + + // жjsonǷGTASK_JSON_IDֶ if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + // GTASK_JSON_IDֶεֵgid setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } - // last_modified + + // жjsonǷGTASK_JSON_LAST_MODIFIEDֶ if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + // GTASK_JSON_LAST_MODIFIEDֶεֵlastModified setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); } - // name + + // жjsonǷGTASK_JSON_NAMEֶ if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + // GTASK_JSON_NAMEֶεֵname setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); } } catch (JSONException e) { + // JSONException쳣ӡ쳣Ϣ׳ActionFailureException쳣 + // ӡ־ Log.e(TAG, e.toString()); + // ӡջϢ e.printStackTrace(); + // ׳쳣ʾȡбʧ throw new ActionFailureException("fail to get tasklist content from jsonobject"); } } } public void setContentByLocalJSON(JSONObject js) { + // жϴJSONObjectǷΪջǷMETA_HEAD_NOTEֶ if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + // Ϊջ߲META_HEAD_NOTEֶΣ־ Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } try { + // ȡJSONObject JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + // жǷΪļ if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // ȡļ String name = folder.getString(NoteColumns.SNIPPET); + // setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + // жǷΪļ if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + // øļ setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + // жǷΪͨ¼ļ else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + // ͨ¼ļ setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE); else + // Ƿϵͳļ Log.e(TAG, "invalid system folder"); } else { + // Log.e(TAG, "error type"); } } catch (JSONException e) { + // 쳣 Log.e(TAG, e.toString()); e.printStackTrace(); } @@ -159,61 +214,86 @@ public class TaskList extends Node { public JSONObject getLocalJSONFromContent() { try { + // һJSONObject JSONObject js = new JSONObject(); + // һJSONObject JSONObject folder = new JSONObject(); + // ȡļ String folderName = getName(); + // ļMIUI_FOLDER_PREFFIXͷȥǰ׺ if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), folderName.length()); + // ļƷfolder folder.put(NoteColumns.SNIPPET, folderName); + // ļĬļлͨ¼ļУΪϵͳ if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + // Ϊļ else folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + // folderjs js.put(GTaskStringUtils.META_HEAD_NOTE, folder); return js; } catch (JSONException e) { + // JSON쳣 Log.e(TAG, e.toString()); + // ӡ쳣Ϣ e.printStackTrace(); + // null return null; } } public int getSyncAction(Cursor c) { try { + // ޸Ϊ0 if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update + + // ͬIDе޸ʱ if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side + + // ޲ return SYNC_ACTION_NONE; } else { - // apply remote to local + + // ظ± return SYNC_ACTION_UPDATE_LOCAL; } } else { - // validate gtask id + + // gtask IDвgetGid()ش if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { Log.e(TAG, "gtask id doesn't match"); return SYNC_ACTION_ERROR; } + // ͬIDе޸ʱ if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only + + // ظԶ return SYNC_ACTION_UPDATE_REMOTE; } else { - // for folder conflicts, just apply local modification + + // ظԶ return SYNC_ACTION_UPDATE_REMOTE; } } } catch (Exception e) { + // ӡ־ Log.e(TAG, e.toString()); + // ӡջϢ e.printStackTrace(); } +// ͬ return SYNC_ACTION_ERROR; +// +public int getChildTaskCount() { + return mChildren.size(); } public int getChildTaskCount() { @@ -221,38 +301,54 @@ public class TaskList extends Node { } public boolean addChildTask(Task task) { + // 巵ֵ boolean ret = false; + // жϴǷΪգmChildrenв if (task != null && !mChildren.contains(task)) { + // ӵmChildren ret = mChildren.add(task); + // ӳɹ if (ret) { - // need to set prior sibling and parent + + // mChildrenΪգǰһֵܽڵΪnull task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); + // ĸڵΪǰ task.setParent(this); } } + // ӽ return ret; } public boolean addChildTask(Task task, int index) { + // indexǷϷ if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); return false; } + // taskǷΪգtaskǷѾmChildren int pos = mChildren.indexOf(task); if (task != null && pos == -1) { + // taskӵmChildrenָλ mChildren.add(index, task); - // update the task list + + // ȡǰǰһͺһ Task preTask = null; +// ȡǰǰһ Task afterTask = null; +// ǰǵһȡǰһ if (index != 0) preTask = mChildren.get(index - 1); +// ǰһȡһ if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); + afterTask = mChildren.get(index + 1);x + 1); + // õǰǰһ task.setPriorSibling(preTask); + // һΪգúһǰһΪǰ if (afterTask != null) afterTask.setPriorSibling(task); } @@ -261,21 +357,32 @@ public class TaskList extends Node { } public boolean removeChildTask(Task task) { + // 巵ֵ boolean ret = false; + // ȡҪɾбе int index = mChildren.indexOf(task); + // Ϊ-1˵ if (index != -1) { + // бɾ ret = mChildren.remove(task); + // ɾɹ if (ret) { - // reset prior sibling and parent + + // ֵΪnull task.setPriorSibling(null); + // ĸΪnull task.setParent(null); - // update the task list + +// indexmChildrenĴС if (index != mChildren.size()) { + // ȡmChildrenindexλõԪأǰһֵܽڵΪmChildrenindex-1λõԪ mChildren.get(index).setPriorSibling( index == 0 ? null : mChildren.get(index - 1)); } +// ret +return ret; } } return ret; @@ -283,25 +390,31 @@ public class TaskList extends Node { public boolean moveChildTask(Task task, int index) { + // indexǷϷ if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "move child task: invalid index"); return false; } + // taskǷmChildren int pos = mChildren.indexOf(task); if (pos == -1) { Log.e(TAG, "move child task: the task should in the list"); return false; } + // posindexȣҪƶ if (pos == index) return true; + // Ƴtaskӵָλ return (removeChildTask(task) && addChildTask(task, index)); } + // gid public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); + // gidȣ򷵻ظ if (t.getGid().equals(gid)) { return t; } @@ -310,34 +423,43 @@ public class TaskList extends Node { } public int getChildTaskIndex(Task task) { + // mChildrenе return mChildren.indexOf(task); } public Task getChildTaskByIndex(int index) { + // ȡ if (index < 0 || index >= mChildren.size()) { + // Чӡ־ Log.e(TAG, "getTaskByIndex: invalid index"); return null; } + // Ӧ return mChildren.get(index); } public Task getChilTaskByGid(String gid) { + // mChildrenбgidȵTask for (Task task : mChildren) { if (task.getGid().equals(gid)) return task; } + // ûҵnull return null; } public ArrayList getChildTaskList() { + // mChildrenб return this.mChildren; } public void setIndex(int index) { + // mIndexֵ this.mIndex = index; } public int getIndex() { + // صǰ return this.mIndex; } }