|  |  |  | @ -35,14 +35,16 @@ import java.util.ArrayList; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |     private ContentValues mNoteDiffValues; | 
			
		
	
		
			
				
					|  |  |  |  |     private NoteData mNoteData; | 
			
		
	
		
			
				
					|  |  |  |  |     private ContentValues mNoteDiffValues;//笔记差异值
 | 
			
		
	
		
			
				
					|  |  |  |  |     private NoteData mNoteData;//笔记数据
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static final String TAG = "Note"; | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * Create a new note id for adding a new note to databases | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  | 	//获取新笔记id
 | 
			
		
	
		
			
				
					|  |  |  |  |     public static synchronized long getNewNoteId(Context context, long folderId) { | 
			
		
	
		
			
				
					|  |  |  |  |         // Create a new note in the database
 | 
			
		
	
		
			
				
					|  |  |  |  |       //创建新笔记并插入数据库
 | 
			
		
	
		
			
				
					|  |  |  |  |         ContentValues values = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |         long createdTime = System.currentTimeMillis(); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.CREATED_DATE, createdTime); | 
			
		
	
	
		
			
				
					|  |  |  | @ -65,46 +67,50 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |         return noteId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 构造函数
 | 
			
		
	
		
			
				
					|  |  |  |  |     public Note() { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData = new NoteData(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	 // 设置笔记值
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setNoteValue(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextData(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置文本数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextDataId(id); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 获取文本数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getTextDataId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteData.mTextDataId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置通话数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setCallDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setCallDataId(id); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setCallData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setCallData(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	 // 检查是否有本地修改
 | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 同步笔记数据到ContentProvider
 | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean syncNote(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (noteId <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalArgumentException("Wrong note id:" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |        // 更新笔记基本信息
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!isLocalModified()) { | 
			
		
	
		
			
				
					|  |  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  |  | @ -118,10 +124,12 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, | 
			
		
	
		
			
				
					|  |  |  |  |                 null) == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |             Log.e(TAG, "Update note error, should not happen"); | 
			
		
	
		
			
				
					|  |  |  |  |           // 即使更新失败也继续处理数据
 | 
			
		
	
		
			
				
					|  |  |  |  |             // Do not return, fall through
 | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       // 更新笔记关联数据
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (mNoteData.isLocalModified() | 
			
		
	
		
			
				
					|  |  |  |  |                 && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
	
		
			
				
					|  |  |  | @ -129,55 +137,54 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         return true; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 内部类:管理笔记关联数据
 | 
			
		
	
		
			
				
					|  |  |  |  |     private class NoteData { | 
			
		
	
		
			
				
					|  |  |  |  |         private long mTextDataId; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mTextDataValues; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private long mCallDataId; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mCallDataValues; | 
			
		
	
		
			
				
					|  |  |  |  |         private long mTextDataId;  // 文本数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mTextDataValues;  // 文本数据值
 | 
			
		
	
		
			
				
					|  |  |  |  |         private long mCallDataId;  // 通话数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mCallDataValues;  // 通话数据值
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private static final String TAG = "NoteData"; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 构造函数
 | 
			
		
	
		
			
				
					|  |  |  |  |         public NoteData() { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 检查是否有本地修改
 | 
			
		
	
		
			
				
					|  |  |  |  |         boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |             return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 设置文本数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if(id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Text data id should larger than 0"); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 设置通话数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Call data id should larger than 0"); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 设置通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 设置文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			 // 将数据推送到ContentProvider
 | 
			
		
	
		
			
				
					|  |  |  |  |         Uri pushIntoContentResolver(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * Check for safety | 
			
		
	
	
		
			
				
					|  |  |  | @ -189,9 +196,11 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); | 
			
		
	
		
			
				
					|  |  |  |  |             ContentProviderOperation.Builder builder = null; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           // 处理文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |             if(mTextDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.put(DataColumns.NOTE_ID, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mTextDataId == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                   // 插入新文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); | 
			
		
	
		
			
				
					|  |  |  |  |                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | 
			
		
	
		
			
				
					|  |  |  |  |                             mTextDataValues); | 
			
		
	
	
		
			
				
					|  |  |  | @ -203,6 +212,7 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                         return null; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                   // 更新现有文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.CONTENT_DATA_URI, mTextDataId)); | 
			
		
	
		
			
				
					|  |  |  |  |                     builder.withValues(mTextDataValues); | 
			
		
	
	
		
			
				
					|  |  |  | @ -211,9 +221,11 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |            // 处理通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |             if(mCallDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.put(DataColumns.NOTE_ID, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mCallDataId == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 插入新通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); | 
			
		
	
		
			
				
					|  |  |  |  |                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | 
			
		
	
		
			
				
					|  |  |  |  |                             mCallDataValues); | 
			
		
	
	
		
			
				
					|  |  |  | @ -225,6 +237,7 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                         return null; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                   // 更新现有通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.CONTENT_DATA_URI, mCallDataId)); | 
			
		
	
		
			
				
					|  |  |  |  |                     builder.withValues(mCallDataValues); | 
			
		
	
	
		
			
				
					|  |  |  | @ -233,6 +246,7 @@ public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |            // 批量执行操作
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (operationList.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 try { | 
			
		
	
		
			
				
					|  |  |  |  |                     ContentProviderResult[] results = context.getContentResolver().applyBatch( | 
			
		
	
	
		
			
				
					|  |  |  | 
 |